{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/AnamikaMangore/ECG_Heartbeat-classification/blob/main/heartbeat_data_generator-MITBIH.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "!pip install wfdb"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "mAnSEUNMC4HX",
        "outputId": "ae16f6c2-da7c-4b5e-c9c4-030209d132ec"
      },
      "execution_count": 29,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Requirement already satisfied: wfdb in /usr/local/lib/python3.11/dist-packages (4.2.0)\n",
            "Requirement already satisfied: matplotlib>=3.2.2 in /usr/local/lib/python3.11/dist-packages (from wfdb) (3.10.0)\n",
            "Requirement already satisfied: numpy>=1.26.4 in /usr/local/lib/python3.11/dist-packages (from wfdb) (1.26.4)\n",
            "Requirement already satisfied: pandas>=2.2.3 in /usr/local/lib/python3.11/dist-packages (from wfdb) (2.2.3)\n",
            "Requirement already satisfied: requests>=2.8.1 in /usr/local/lib/python3.11/dist-packages (from wfdb) (2.32.3)\n",
            "Requirement already satisfied: scipy>=1.13.0 in /usr/local/lib/python3.11/dist-packages (from wfdb) (1.13.1)\n",
            "Requirement already satisfied: soundfile>=0.10.0 in /usr/local/lib/python3.11/dist-packages (from wfdb) (0.13.1)\n",
            "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.2.2->wfdb) (1.3.1)\n",
            "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.2.2->wfdb) (0.12.1)\n",
            "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.2.2->wfdb) (4.56.0)\n",
            "Requirement already satisfied: kiwisolver>=1.3.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.2.2->wfdb) (1.4.8)\n",
            "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.2.2->wfdb) (24.2)\n",
            "Requirement already satisfied: pillow>=8 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.2.2->wfdb) (11.1.0)\n",
            "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.2.2->wfdb) (3.2.1)\n",
            "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.2.2->wfdb) (2.8.2)\n",
            "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.11/dist-packages (from pandas>=2.2.3->wfdb) (2025.1)\n",
            "Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.11/dist-packages (from pandas>=2.2.3->wfdb) (2025.1)\n",
            "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/dist-packages (from requests>=2.8.1->wfdb) (3.4.1)\n",
            "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.11/dist-packages (from requests>=2.8.1->wfdb) (3.10)\n",
            "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/dist-packages (from requests>=2.8.1->wfdb) (2.3.0)\n",
            "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.11/dist-packages (from requests>=2.8.1->wfdb) (2025.1.31)\n",
            "Requirement already satisfied: cffi>=1.0 in /usr/local/lib/python3.11/dist-packages (from soundfile>=0.10.0->wfdb) (1.17.1)\n",
            "Requirement already satisfied: pycparser in /usr/local/lib/python3.11/dist-packages (from cffi>=1.0->soundfile>=0.10.0->wfdb) (2.22)\n",
            "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.11/dist-packages (from python-dateutil>=2.7->matplotlib>=3.2.2->wfdb) (1.17.0)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# prompt: code to mount drive\n",
        "\n",
        "from google.colab import drive\n",
        "drive.mount('/content/drive')\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "yhdvmWd0uX0t",
        "outputId": "094b861f-86ab-4876-c74f-669f1111d0f9"
      },
      "execution_count": 3,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "!pip install pyts\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "8N96_pX-uzVA",
        "outputId": "63a94cb9-a83f-482f-8ada-f28b291ad012"
      },
      "execution_count": 4,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Requirement already satisfied: pyts in /usr/local/lib/python3.11/dist-packages (0.13.0)\n",
            "Requirement already satisfied: numpy>=1.22.4 in /usr/local/lib/python3.11/dist-packages (from pyts) (1.26.4)\n",
            "Requirement already satisfied: scipy>=1.8.1 in /usr/local/lib/python3.11/dist-packages (from pyts) (1.13.1)\n",
            "Requirement already satisfied: scikit-learn>=1.2.0 in /usr/local/lib/python3.11/dist-packages (from pyts) (1.6.1)\n",
            "Requirement already satisfied: joblib>=1.1.1 in /usr/local/lib/python3.11/dist-packages (from pyts) (1.4.2)\n",
            "Requirement already satisfied: numba>=0.55.2 in /usr/local/lib/python3.11/dist-packages (from pyts) (0.61.0)\n",
            "Requirement already satisfied: llvmlite<0.45,>=0.44.0dev0 in /usr/local/lib/python3.11/dist-packages (from numba>=0.55.2->pyts) (0.44.0)\n",
            "Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn>=1.2.0->pyts) (3.5.0)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import pyts\n",
        "print(pyts.__version__)\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "4Ec_ADk-u3WV",
        "outputId": "525b4f3d-1a8e-4f3b-f604-54e6fad909fe"
      },
      "execution_count": 5,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "0.13.0\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import pandas as pd\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "from mpl_toolkits.axes_grid1 import ImageGrid\n",
        "from pyts.image import GramianAngularField, MarkovTransitionField\n",
        "from pyts.datasets import load_gunpoint\n",
        "from sklearn.metrics.pairwise import cosine_similarity\n",
        "from sklearn.metrics.pairwise import pairwise_distances\n",
        "from sklearn.utils import resample\n",
        "from imblearn.combine import SMOTETomek\n",
        "from imblearn.over_sampling import SMOTE\n",
        "from imblearn.under_sampling import TomekLinks, NearMiss\n",
        "from sklearn.model_selection import train_test_split"
      ],
      "metadata": {
        "id": "KYeqjJwWuiSK"
      },
      "execution_count": 6,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "import torch\n",
        "import torch.nn as nn\n",
        "import torch.nn.functional as F\n",
        "import torch.optim as optim\n",
        "import torchvision\n",
        "from torchvision import datasets, transforms\n",
        "from torch.utils.data import DataLoader, Dataset,TensorDataset"
      ],
      "metadata": {
        "id": "R5Lw4PDGvPYl"
      },
      "execution_count": 7,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "from matplotlib import colors\n",
        "from IPython import display\n",
        "import os\n",
        "from torch.utils.data.dataset import Dataset\n",
        "from matplotlib.pyplot import imread\n",
        "import glob\n",
        "import os\n",
        "import random\n",
        "from sklearn.preprocessing import LabelEncoder\n",
        "\n",
        "from torchvision.models import alexnet, vgg16, resnet152, resnet18, vgg19\n",
        "\n",
        "%matplotlib inline\n",
        "\n",
        "from torch.distributions.utils import lazy_property\n",
        "import math\n",
        "import h5py\n",
        "from PIL import Image\n",
        "\n",
        "\n",
        "import torch.nn.functional as nnf\n",
        "from torch.utils.data import random_split\n",
        "from torch.optim import SGD\n",
        "from torch.distributions import constraints\n",
        "import torchvision as torchv\n",
        "import torchvision.transforms as torchvt\n",
        "import pickle\n",
        "from sklearn.preprocessing import StandardScaler, MinMaxScaler"
      ],
      "metadata": {
        "id": "q3BHieUUvVtg"
      },
      "execution_count": 8,
      "outputs": []
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "metadata": {
        "id": "BtvV8mpdgX7r"
      },
      "outputs": [],
      "source": [
        "train_df=pd.read_csv('/content/drive/MyDrive/Colab Notebooks/heartbeat_dataset/mitbih_train.csv',header=None)\n",
        "test_df=pd.read_csv('/content/drive/MyDrive/Colab Notebooks/heartbeat_dataset/mitbih_test.csv',header=None)"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "train_df.head()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 255
        },
        "id": "y7qIQcfsvl6v",
        "outputId": "be923808-069d-4bb3-d2e8-39938381e99b"
      },
      "execution_count": 10,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "        0         1         2         3         4         5         6    \\\n",
              "0  0.977941  0.926471  0.681373  0.245098  0.154412  0.191176  0.151961   \n",
              "1  0.960114  0.863248  0.461538  0.196581  0.094017  0.125356  0.099715   \n",
              "2  1.000000  0.659459  0.186486  0.070270  0.070270  0.059459  0.056757   \n",
              "3  0.925414  0.665746  0.541436  0.276243  0.196133  0.077348  0.071823   \n",
              "4  0.967136  1.000000  0.830986  0.586854  0.356808  0.248826  0.145540   \n",
              "\n",
              "        7         8         9    ...  178  179  180  181  182  183  184  185  \\\n",
              "0  0.085784  0.058824  0.049020  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "1  0.088319  0.074074  0.082621  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "2  0.043243  0.054054  0.045946  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "3  0.060773  0.066298  0.058011  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "4  0.089202  0.117371  0.150235  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "\n",
              "   186  187  \n",
              "0  0.0  0.0  \n",
              "1  0.0  0.0  \n",
              "2  0.0  0.0  \n",
              "3  0.0  0.0  \n",
              "4  0.0  0.0  \n",
              "\n",
              "[5 rows x 188 columns]"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-66554bfb-dea7-43c0-b1ed-2c16b74067e3\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>0</th>\n",
              "      <th>1</th>\n",
              "      <th>2</th>\n",
              "      <th>3</th>\n",
              "      <th>4</th>\n",
              "      <th>5</th>\n",
              "      <th>6</th>\n",
              "      <th>7</th>\n",
              "      <th>8</th>\n",
              "      <th>9</th>\n",
              "      <th>...</th>\n",
              "      <th>178</th>\n",
              "      <th>179</th>\n",
              "      <th>180</th>\n",
              "      <th>181</th>\n",
              "      <th>182</th>\n",
              "      <th>183</th>\n",
              "      <th>184</th>\n",
              "      <th>185</th>\n",
              "      <th>186</th>\n",
              "      <th>187</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>0.977941</td>\n",
              "      <td>0.926471</td>\n",
              "      <td>0.681373</td>\n",
              "      <td>0.245098</td>\n",
              "      <td>0.154412</td>\n",
              "      <td>0.191176</td>\n",
              "      <td>0.151961</td>\n",
              "      <td>0.085784</td>\n",
              "      <td>0.058824</td>\n",
              "      <td>0.049020</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>0.960114</td>\n",
              "      <td>0.863248</td>\n",
              "      <td>0.461538</td>\n",
              "      <td>0.196581</td>\n",
              "      <td>0.094017</td>\n",
              "      <td>0.125356</td>\n",
              "      <td>0.099715</td>\n",
              "      <td>0.088319</td>\n",
              "      <td>0.074074</td>\n",
              "      <td>0.082621</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.659459</td>\n",
              "      <td>0.186486</td>\n",
              "      <td>0.070270</td>\n",
              "      <td>0.070270</td>\n",
              "      <td>0.059459</td>\n",
              "      <td>0.056757</td>\n",
              "      <td>0.043243</td>\n",
              "      <td>0.054054</td>\n",
              "      <td>0.045946</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>0.925414</td>\n",
              "      <td>0.665746</td>\n",
              "      <td>0.541436</td>\n",
              "      <td>0.276243</td>\n",
              "      <td>0.196133</td>\n",
              "      <td>0.077348</td>\n",
              "      <td>0.071823</td>\n",
              "      <td>0.060773</td>\n",
              "      <td>0.066298</td>\n",
              "      <td>0.058011</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>0.967136</td>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.830986</td>\n",
              "      <td>0.586854</td>\n",
              "      <td>0.356808</td>\n",
              "      <td>0.248826</td>\n",
              "      <td>0.145540</td>\n",
              "      <td>0.089202</td>\n",
              "      <td>0.117371</td>\n",
              "      <td>0.150235</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>5 rows × 188 columns</p>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-66554bfb-dea7-43c0-b1ed-2c16b74067e3')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-66554bfb-dea7-43c0-b1ed-2c16b74067e3 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-66554bfb-dea7-43c0-b1ed-2c16b74067e3');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-de8d571e-1fe8-4ed7-bbaf-d94439bbbe1b\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-de8d571e-1fe8-4ed7-bbaf-d94439bbbe1b')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-de8d571e-1fe8-4ed7-bbaf-d94439bbbe1b button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "train_df"
            }
          },
          "metadata": {},
          "execution_count": 10
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "test_df.shape"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "dIf_gZb8v4Q5",
        "outputId": "91202ec8-f8f4-4152-cd30-d82313978558"
      },
      "execution_count": 11,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(21892, 188)"
            ]
          },
          "metadata": {},
          "execution_count": 11
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "train_df[187].value_counts()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 272
        },
        "id": "eeFDll5Ov-F2",
        "outputId": "2af05549-574b-4ae9-ee28-66ffdcfc451f"
      },
      "execution_count": 12,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "187\n",
              "0.0    72471\n",
              "4.0     6431\n",
              "2.0     5788\n",
              "1.0     2223\n",
              "3.0      641\n",
              "Name: count, dtype: int64"
            ],
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>count</th>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>187</th>\n",
              "      <th></th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0.0</th>\n",
              "      <td>72471</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4.0</th>\n",
              "      <td>6431</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2.0</th>\n",
              "      <td>5788</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1.0</th>\n",
              "      <td>2223</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3.0</th>\n",
              "      <td>641</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div><br><label><b>dtype:</b> int64</label>"
            ]
          },
          "metadata": {},
          "execution_count": 12
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "test_df[187].value_counts()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 272
        },
        "id": "tZPyH_gxwYjC",
        "outputId": "27d4fb31-aea0-47d0-e05d-3115f7a5e59e"
      },
      "execution_count": 13,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "187\n",
              "0.0    18118\n",
              "4.0     1608\n",
              "2.0     1448\n",
              "1.0      556\n",
              "3.0      162\n",
              "Name: count, dtype: int64"
            ],
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>count</th>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>187</th>\n",
              "      <th></th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0.0</th>\n",
              "      <td>18118</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4.0</th>\n",
              "      <td>1608</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2.0</th>\n",
              "      <td>1448</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1.0</th>\n",
              "      <td>556</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3.0</th>\n",
              "      <td>162</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div><br><label><b>dtype:</b> int64</label>"
            ]
          },
          "metadata": {},
          "execution_count": 13
        }
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 14,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 443
        },
        "id": "36rpCbOmtmuy",
        "outputId": "efd0d496-4c61-454b-d24c-f9aed39774f1"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "            0         1         2         3         4         5         6    \\\n",
              "80482  1.000000  0.899749  0.641604  0.314536  0.101504  0.107769  0.111529   \n",
              "80483  0.732252  1.000000  0.983773  0.484787  0.178499  0.111562  0.081136   \n",
              "80484  0.991984  1.000000  0.601202  0.280561  0.158317  0.146293  0.104208   \n",
              "80485  0.778378  0.528378  0.258108  0.128378  0.000000  0.037838  0.167568   \n",
              "80486  1.000000  0.914931  0.531250  0.303819  0.178819  0.157986  0.128472   \n",
              "...         ...       ...       ...       ...       ...       ...       ...   \n",
              "81118  0.771529  1.000000  0.776801  0.316344  0.165202  0.124780  0.117750   \n",
              "81119  0.590000  0.373333  0.283333  0.303333  0.340000  0.263333  0.136667   \n",
              "81120  1.000000  0.939286  0.553571  0.285714  0.166071  0.141071  0.112500   \n",
              "81121  1.000000  0.964981  0.778210  0.513619  0.214008  0.090791  0.112840   \n",
              "81122  0.724014  1.000000  0.801075  0.252688  0.093190  0.066308  0.043011   \n",
              "\n",
              "            7         8         9    ...  178  179  180  181  182  183  184  \\\n",
              "80482  0.071429  0.063910  0.058897  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "80483  0.050710  0.046653  0.046653  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "80484  0.090180  0.080160  0.070140  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "80485  0.235135  0.227027  0.222973  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "80486  0.126736  0.118056  0.111111  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "...         ...       ...       ...  ...  ...  ...  ...  ...  ...  ...  ...   \n",
              "81118  0.108963  0.084359  0.091388  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "81119  0.120000  0.090000  0.110000  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "81120  0.108929  0.094643  0.096429  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "81121  0.097276  0.075227  0.070039  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "81122  0.030466  0.021505  0.021505  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "\n",
              "       185  186  187  \n",
              "80482  0.0  0.0  3.0  \n",
              "80483  0.0  0.0  3.0  \n",
              "80484  0.0  0.0  3.0  \n",
              "80485  0.0  0.0  3.0  \n",
              "80486  0.0  0.0  3.0  \n",
              "...    ...  ...  ...  \n",
              "81118  0.0  0.0  3.0  \n",
              "81119  0.0  0.0  3.0  \n",
              "81120  0.0  0.0  3.0  \n",
              "81121  0.0  0.0  3.0  \n",
              "81122  0.0  0.0  3.0  \n",
              "\n",
              "[641 rows x 188 columns]"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-51c25f57-0751-4204-baae-0dbeee9f4300\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>0</th>\n",
              "      <th>1</th>\n",
              "      <th>2</th>\n",
              "      <th>3</th>\n",
              "      <th>4</th>\n",
              "      <th>5</th>\n",
              "      <th>6</th>\n",
              "      <th>7</th>\n",
              "      <th>8</th>\n",
              "      <th>9</th>\n",
              "      <th>...</th>\n",
              "      <th>178</th>\n",
              "      <th>179</th>\n",
              "      <th>180</th>\n",
              "      <th>181</th>\n",
              "      <th>182</th>\n",
              "      <th>183</th>\n",
              "      <th>184</th>\n",
              "      <th>185</th>\n",
              "      <th>186</th>\n",
              "      <th>187</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>80482</th>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.899749</td>\n",
              "      <td>0.641604</td>\n",
              "      <td>0.314536</td>\n",
              "      <td>0.101504</td>\n",
              "      <td>0.107769</td>\n",
              "      <td>0.111529</td>\n",
              "      <td>0.071429</td>\n",
              "      <td>0.063910</td>\n",
              "      <td>0.058897</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>3.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>80483</th>\n",
              "      <td>0.732252</td>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.983773</td>\n",
              "      <td>0.484787</td>\n",
              "      <td>0.178499</td>\n",
              "      <td>0.111562</td>\n",
              "      <td>0.081136</td>\n",
              "      <td>0.050710</td>\n",
              "      <td>0.046653</td>\n",
              "      <td>0.046653</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>3.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>80484</th>\n",
              "      <td>0.991984</td>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.601202</td>\n",
              "      <td>0.280561</td>\n",
              "      <td>0.158317</td>\n",
              "      <td>0.146293</td>\n",
              "      <td>0.104208</td>\n",
              "      <td>0.090180</td>\n",
              "      <td>0.080160</td>\n",
              "      <td>0.070140</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>3.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>80485</th>\n",
              "      <td>0.778378</td>\n",
              "      <td>0.528378</td>\n",
              "      <td>0.258108</td>\n",
              "      <td>0.128378</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.037838</td>\n",
              "      <td>0.167568</td>\n",
              "      <td>0.235135</td>\n",
              "      <td>0.227027</td>\n",
              "      <td>0.222973</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>3.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>80486</th>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.914931</td>\n",
              "      <td>0.531250</td>\n",
              "      <td>0.303819</td>\n",
              "      <td>0.178819</td>\n",
              "      <td>0.157986</td>\n",
              "      <td>0.128472</td>\n",
              "      <td>0.126736</td>\n",
              "      <td>0.118056</td>\n",
              "      <td>0.111111</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>3.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>81118</th>\n",
              "      <td>0.771529</td>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.776801</td>\n",
              "      <td>0.316344</td>\n",
              "      <td>0.165202</td>\n",
              "      <td>0.124780</td>\n",
              "      <td>0.117750</td>\n",
              "      <td>0.108963</td>\n",
              "      <td>0.084359</td>\n",
              "      <td>0.091388</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>3.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>81119</th>\n",
              "      <td>0.590000</td>\n",
              "      <td>0.373333</td>\n",
              "      <td>0.283333</td>\n",
              "      <td>0.303333</td>\n",
              "      <td>0.340000</td>\n",
              "      <td>0.263333</td>\n",
              "      <td>0.136667</td>\n",
              "      <td>0.120000</td>\n",
              "      <td>0.090000</td>\n",
              "      <td>0.110000</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>3.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>81120</th>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.939286</td>\n",
              "      <td>0.553571</td>\n",
              "      <td>0.285714</td>\n",
              "      <td>0.166071</td>\n",
              "      <td>0.141071</td>\n",
              "      <td>0.112500</td>\n",
              "      <td>0.108929</td>\n",
              "      <td>0.094643</td>\n",
              "      <td>0.096429</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>3.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>81121</th>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.964981</td>\n",
              "      <td>0.778210</td>\n",
              "      <td>0.513619</td>\n",
              "      <td>0.214008</td>\n",
              "      <td>0.090791</td>\n",
              "      <td>0.112840</td>\n",
              "      <td>0.097276</td>\n",
              "      <td>0.075227</td>\n",
              "      <td>0.070039</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>3.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>81122</th>\n",
              "      <td>0.724014</td>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.801075</td>\n",
              "      <td>0.252688</td>\n",
              "      <td>0.093190</td>\n",
              "      <td>0.066308</td>\n",
              "      <td>0.043011</td>\n",
              "      <td>0.030466</td>\n",
              "      <td>0.021505</td>\n",
              "      <td>0.021505</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>3.0</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>641 rows × 188 columns</p>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-51c25f57-0751-4204-baae-0dbeee9f4300')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-51c25f57-0751-4204-baae-0dbeee9f4300 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-51c25f57-0751-4204-baae-0dbeee9f4300');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-9c5b079d-f700-4d65-94c8-ec365b3237ce\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-9c5b079d-f700-4d65-94c8-ec365b3237ce')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-9c5b079d-f700-4d65-94c8-ec365b3237ce button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe"
            }
          },
          "metadata": {},
          "execution_count": 14
        }
      ],
      "source": [
        "train_df[train_df[187] == 3]"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "train_df[train_df[187] == 3].shape"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "7yq_v6MkwmaO",
        "outputId": "85c9a843-16a3-4056-f3d1-c090c6091186"
      },
      "execution_count": 15,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(641, 188)"
            ]
          },
          "metadata": {},
          "execution_count": 15
        }
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 16,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "ak7yuR7Htmuz",
        "outputId": "ee96a697-d27e-47ef-99f2-4c0bd6ccdb65"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(87554, 188)"
            ]
          },
          "metadata": {},
          "execution_count": 16
        }
      ],
      "source": [
        "train_df.shape"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 17,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "xMdQZLgDtmuz",
        "outputId": "912d26f4-3dba-42ec-c41d-75bd70738567"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(21892, 188)"
            ]
          },
          "metadata": {},
          "execution_count": 17
        }
      ],
      "source": [
        "test_df.shape"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 18,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 255
        },
        "id": "iW4eQ7hptmuz",
        "outputId": "b5097f2a-c771-4c3c-9560-aebe68f81a9a"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "        0         1         2         3         4         5         6    \\\n",
              "0  0.977941  0.926471  0.681373  0.245098  0.154412  0.191176  0.151961   \n",
              "1  0.960114  0.863248  0.461538  0.196581  0.094017  0.125356  0.099715   \n",
              "2  1.000000  0.659459  0.186486  0.070270  0.070270  0.059459  0.056757   \n",
              "3  0.925414  0.665746  0.541436  0.276243  0.196133  0.077348  0.071823   \n",
              "4  0.967136  1.000000  0.830986  0.586854  0.356808  0.248826  0.145540   \n",
              "\n",
              "        7         8         9    ...  178  179  180  181  182  183  184  185  \\\n",
              "0  0.085784  0.058824  0.049020  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "1  0.088319  0.074074  0.082621  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "2  0.043243  0.054054  0.045946  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "3  0.060773  0.066298  0.058011  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "4  0.089202  0.117371  0.150235  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "\n",
              "   186  187  \n",
              "0  0.0  0.0  \n",
              "1  0.0  0.0  \n",
              "2  0.0  0.0  \n",
              "3  0.0  0.0  \n",
              "4  0.0  0.0  \n",
              "\n",
              "[5 rows x 188 columns]"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-2ef0ffea-ea63-4b1d-b35d-6663dde49e49\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>0</th>\n",
              "      <th>1</th>\n",
              "      <th>2</th>\n",
              "      <th>3</th>\n",
              "      <th>4</th>\n",
              "      <th>5</th>\n",
              "      <th>6</th>\n",
              "      <th>7</th>\n",
              "      <th>8</th>\n",
              "      <th>9</th>\n",
              "      <th>...</th>\n",
              "      <th>178</th>\n",
              "      <th>179</th>\n",
              "      <th>180</th>\n",
              "      <th>181</th>\n",
              "      <th>182</th>\n",
              "      <th>183</th>\n",
              "      <th>184</th>\n",
              "      <th>185</th>\n",
              "      <th>186</th>\n",
              "      <th>187</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>0.977941</td>\n",
              "      <td>0.926471</td>\n",
              "      <td>0.681373</td>\n",
              "      <td>0.245098</td>\n",
              "      <td>0.154412</td>\n",
              "      <td>0.191176</td>\n",
              "      <td>0.151961</td>\n",
              "      <td>0.085784</td>\n",
              "      <td>0.058824</td>\n",
              "      <td>0.049020</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>0.960114</td>\n",
              "      <td>0.863248</td>\n",
              "      <td>0.461538</td>\n",
              "      <td>0.196581</td>\n",
              "      <td>0.094017</td>\n",
              "      <td>0.125356</td>\n",
              "      <td>0.099715</td>\n",
              "      <td>0.088319</td>\n",
              "      <td>0.074074</td>\n",
              "      <td>0.082621</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.659459</td>\n",
              "      <td>0.186486</td>\n",
              "      <td>0.070270</td>\n",
              "      <td>0.070270</td>\n",
              "      <td>0.059459</td>\n",
              "      <td>0.056757</td>\n",
              "      <td>0.043243</td>\n",
              "      <td>0.054054</td>\n",
              "      <td>0.045946</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>0.925414</td>\n",
              "      <td>0.665746</td>\n",
              "      <td>0.541436</td>\n",
              "      <td>0.276243</td>\n",
              "      <td>0.196133</td>\n",
              "      <td>0.077348</td>\n",
              "      <td>0.071823</td>\n",
              "      <td>0.060773</td>\n",
              "      <td>0.066298</td>\n",
              "      <td>0.058011</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>0.967136</td>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.830986</td>\n",
              "      <td>0.586854</td>\n",
              "      <td>0.356808</td>\n",
              "      <td>0.248826</td>\n",
              "      <td>0.145540</td>\n",
              "      <td>0.089202</td>\n",
              "      <td>0.117371</td>\n",
              "      <td>0.150235</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>5 rows × 188 columns</p>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-2ef0ffea-ea63-4b1d-b35d-6663dde49e49')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-2ef0ffea-ea63-4b1d-b35d-6663dde49e49 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-2ef0ffea-ea63-4b1d-b35d-6663dde49e49');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-0695de83-a07d-43a0-bfa0-222b08de0927\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-0695de83-a07d-43a0-bfa0-222b08de0927')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-0695de83-a07d-43a0-bfa0-222b08de0927 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "train_df"
            }
          },
          "metadata": {},
          "execution_count": 18
        }
      ],
      "source": [
        "train_df.head(5)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 19,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 255
        },
        "id": "EGqGjnDHtmuz",
        "outputId": "71109137-da28-4114-9e7f-714ed63ea8fc"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "            0         1         2         3         4         5         6    \\\n",
              "87549  0.807018  0.494737  0.536842  0.529825  0.491228  0.484211  0.456140   \n",
              "87550  0.718333  0.605000  0.486667  0.361667  0.231667  0.120000  0.051667   \n",
              "87551  0.906122  0.624490  0.595918  0.575510  0.530612  0.481633  0.444898   \n",
              "87552  0.858228  0.645570  0.845570  0.248101  0.167089  0.131646  0.121519   \n",
              "87553  0.901506  0.845886  0.800695  0.748552  0.687138  0.599073  0.512167   \n",
              "\n",
              "            7         8         9    ...  178  179  180  181  182  183  184  \\\n",
              "87549  0.396491  0.284211  0.136842  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "87550  0.001667  0.000000  0.013333  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "87551  0.387755  0.322449  0.191837  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "87552  0.121519  0.118987  0.103797  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "87553  0.427578  0.395133  0.402086  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
              "\n",
              "       185  186  187  \n",
              "87549  0.0  0.0  4.0  \n",
              "87550  0.0  0.0  4.0  \n",
              "87551  0.0  0.0  4.0  \n",
              "87552  0.0  0.0  4.0  \n",
              "87553  0.0  0.0  4.0  \n",
              "\n",
              "[5 rows x 188 columns]"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-4a9c231a-d16c-4cb8-b4ae-a97df563074c\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>0</th>\n",
              "      <th>1</th>\n",
              "      <th>2</th>\n",
              "      <th>3</th>\n",
              "      <th>4</th>\n",
              "      <th>5</th>\n",
              "      <th>6</th>\n",
              "      <th>7</th>\n",
              "      <th>8</th>\n",
              "      <th>9</th>\n",
              "      <th>...</th>\n",
              "      <th>178</th>\n",
              "      <th>179</th>\n",
              "      <th>180</th>\n",
              "      <th>181</th>\n",
              "      <th>182</th>\n",
              "      <th>183</th>\n",
              "      <th>184</th>\n",
              "      <th>185</th>\n",
              "      <th>186</th>\n",
              "      <th>187</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>87549</th>\n",
              "      <td>0.807018</td>\n",
              "      <td>0.494737</td>\n",
              "      <td>0.536842</td>\n",
              "      <td>0.529825</td>\n",
              "      <td>0.491228</td>\n",
              "      <td>0.484211</td>\n",
              "      <td>0.456140</td>\n",
              "      <td>0.396491</td>\n",
              "      <td>0.284211</td>\n",
              "      <td>0.136842</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>4.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>87550</th>\n",
              "      <td>0.718333</td>\n",
              "      <td>0.605000</td>\n",
              "      <td>0.486667</td>\n",
              "      <td>0.361667</td>\n",
              "      <td>0.231667</td>\n",
              "      <td>0.120000</td>\n",
              "      <td>0.051667</td>\n",
              "      <td>0.001667</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.013333</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>4.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>87551</th>\n",
              "      <td>0.906122</td>\n",
              "      <td>0.624490</td>\n",
              "      <td>0.595918</td>\n",
              "      <td>0.575510</td>\n",
              "      <td>0.530612</td>\n",
              "      <td>0.481633</td>\n",
              "      <td>0.444898</td>\n",
              "      <td>0.387755</td>\n",
              "      <td>0.322449</td>\n",
              "      <td>0.191837</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>4.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>87552</th>\n",
              "      <td>0.858228</td>\n",
              "      <td>0.645570</td>\n",
              "      <td>0.845570</td>\n",
              "      <td>0.248101</td>\n",
              "      <td>0.167089</td>\n",
              "      <td>0.131646</td>\n",
              "      <td>0.121519</td>\n",
              "      <td>0.121519</td>\n",
              "      <td>0.118987</td>\n",
              "      <td>0.103797</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>4.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>87553</th>\n",
              "      <td>0.901506</td>\n",
              "      <td>0.845886</td>\n",
              "      <td>0.800695</td>\n",
              "      <td>0.748552</td>\n",
              "      <td>0.687138</td>\n",
              "      <td>0.599073</td>\n",
              "      <td>0.512167</td>\n",
              "      <td>0.427578</td>\n",
              "      <td>0.395133</td>\n",
              "      <td>0.402086</td>\n",
              "      <td>...</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>0.0</td>\n",
              "      <td>4.0</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>5 rows × 188 columns</p>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-4a9c231a-d16c-4cb8-b4ae-a97df563074c')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-4a9c231a-d16c-4cb8-b4ae-a97df563074c button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-4a9c231a-d16c-4cb8-b4ae-a97df563074c');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-9e49b2f1-67eb-4a47-8ab3-5f617232407a\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-9e49b2f1-67eb-4a47-8ab3-5f617232407a')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-9e49b2f1-67eb-4a47-8ab3-5f617232407a button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe"
            }
          },
          "metadata": {},
          "execution_count": 19
        }
      ],
      "source": [
        "train_df.tail(5)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 20,
      "metadata": {
        "id": "xhJzHyPjtmuz"
      },
      "outputs": [],
      "source": [
        "# omit last column as y\n",
        "x_train = train_df.iloc[:,:187]\n",
        "x_test = test_df.iloc[:,:187]"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Load your dataset (assuming CSV with ECG signals as rows)\n",
        "df = pd.read_csv(\"/content/drive/MyDrive/Colab Notebooks/heartbeat_dataset/mitbih_train.csv\")  # Replace with your actual file\n",
        "X = df.values  # Convert to NumPy array\n",
        "\n"
      ],
      "metadata": {
        "id": "HdHmwPqhzBoa"
      },
      "execution_count": 21,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "print(\"Column Names:\", df.columns)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "QNvMUKXO_zlM",
        "outputId": "c9884e87-136e-44e6-b38e-60fceee9155e"
      },
      "execution_count": 22,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Column Names: Index(['9.779411554336547852e-01', '9.264705777168273926e-01',\n",
            "       '6.813725233078002930e-01', '2.450980395078659058e-01',\n",
            "       '1.544117629528045654e-01', '1.911764740943908691e-01',\n",
            "       '1.519607901573181152e-01', '8.578431606292724609e-02',\n",
            "       '5.882352963089942932e-02', '4.901960864663124084e-02',\n",
            "       ...\n",
            "       '0.000000000000000000e+00.79', '0.000000000000000000e+00.80',\n",
            "       '0.000000000000000000e+00.81', '0.000000000000000000e+00.82',\n",
            "       '0.000000000000000000e+00.83', '0.000000000000000000e+00.84',\n",
            "       '0.000000000000000000e+00.85', '0.000000000000000000e+00.86',\n",
            "       '0.000000000000000000e+00.87', '0.000000000000000000e+00.88'],\n",
            "      dtype='object', length=188)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "df = pd.read_csv(\"/content/drive/MyDrive/Colab Notebooks/heartbeat_dataset/mitbih_train.csv\", encoding='utf-8', engine='python')\n",
        "\n"
      ],
      "metadata": {
        "id": "m4p40Z1gAOaV"
      },
      "execution_count": 23,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# prompt: how to print the name of the column\n",
        "\n",
        "print(\"Column Names:\", df.columns)\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Lapd_oAsAbZ2",
        "outputId": "6450118c-ced5-41b6-ab5f-661c56ffc69d"
      },
      "execution_count": 24,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Column Names: Index(['9.779411554336547852e-01', '9.264705777168273926e-01',\n",
            "       '6.813725233078002930e-01', '2.450980395078659058e-01',\n",
            "       '1.544117629528045654e-01', '1.911764740943908691e-01',\n",
            "       '1.519607901573181152e-01', '8.578431606292724609e-02',\n",
            "       '5.882352963089942932e-02', '4.901960864663124084e-02',\n",
            "       ...\n",
            "       '0.000000000000000000e+00.79', '0.000000000000000000e+00.80',\n",
            "       '0.000000000000000000e+00.81', '0.000000000000000000e+00.82',\n",
            "       '0.000000000000000000e+00.83', '0.000000000000000000e+00.84',\n",
            "       '0.000000000000000000e+00.85', '0.000000000000000000e+00.86',\n",
            "       '0.000000000000000000e+00.87', '0.000000000000000000e+00.88'],\n",
            "      dtype='object', length=188)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# prompt: wrire the code to define signals and labels\n",
        "\n",
        "# Define signals and labels\n",
        "signals = x_train.values\n",
        "labels = train_df[187].values\n",
        "test_signals = x_test.values\n",
        "test_labels = test_df[187].values\n"
      ],
      "metadata": {
        "id": "GowIzWcQBYUu"
      },
      "execution_count": 25,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "import pandas as pd\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "from pyts.image import GramianAngularField\n",
        "import seaborn as sns\n",
        "\n",
        "def load_mitbih_csv():\n",
        "    try:\n",
        "        # Path to your dataset\n",
        "        file_path = \"/content/drive/MyDrive/Colab Notebooks/heartbeat_dataset/mitbih_train.csv\"\n",
        "\n",
        "        # Load the CSV file\n",
        "        df = pd.read_csv(file_path, header=None)  # No header in the MIT-BIH dataset\n",
        "\n",
        "        print(\"Dataset loaded successfully!\")\n",
        "        print(\"Shape of dataset:\", df.shape)\n",
        "\n",
        "        # Extract signals and labels\n",
        "        X = df.iloc[:, :-1].values  # All columns except the last one (ECG signal data)\n",
        "        y = df.iloc[:, -1].values   # The last column (labels)\n",
        "\n",
        "        print(\"Signals shape:\", X.shape)\n",
        "        print(\"Labels shape:\", y.shape)\n",
        "\n",
        "        # Print class distribution\n",
        "        unique_labels, counts = np.unique(y, return_counts=True)\n",
        "        print(\"\\nClass distribution:\")\n",
        "        for label, count in zip(unique_labels, counts):\n",
        "            print(f\"Class {label}: {count} samples\")\n",
        "\n",
        "        return X, y\n",
        "\n",
        "    except Exception as e:\n",
        "        print(f\"Error loading data: {str(e)}\")\n",
        "        raise\n",
        "\n",
        "# Load dataset\n",
        "X, y = load_mitbih_csv()\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "i6JEgJWEFMxe",
        "outputId": "aa6de9f0-1798-4792-92a6-6e354f9c35c0"
      },
      "execution_count": 26,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Dataset loaded successfully!\n",
            "Shape of dataset: (87554, 188)\n",
            "Signals shape: (87554, 187)\n",
            "Labels shape: (87554,)\n",
            "\n",
            "Class distribution:\n",
            "Class 0.0: 72471 samples\n",
            "Class 1.0: 2223 samples\n",
            "Class 2.0: 5788 samples\n",
            "Class 3.0: 641 samples\n",
            "Class 4.0: 6431 samples\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import numpy as np\n",
        "import pandas as pd\n",
        "import matplotlib.pyplot as plt\n",
        "import seaborn as sns\n",
        "from pyts.image import GramianAngularField\n",
        "\n",
        "# Load dataset\n",
        "def load_mitbih_csv():\n",
        "    file_path = \"/content/drive/MyDrive/Colab Notebooks/heartbeat_dataset/mitbih_train.csv\"\n",
        "\n",
        "    df = pd.read_csv(file_path, header=None)\n",
        "    print(\"Dataset loaded successfully! Shape:\", df.shape)\n",
        "\n",
        "    # Extract signals and labels\n",
        "    X = df.iloc[:, :-1].values  # ECG signals\n",
        "    y = df.iloc[:, -1].values   # Labels\n",
        "\n",
        "    return X, y\n",
        "\n",
        "# Load data\n",
        "X, y = load_mitbih_csv()\n",
        "\n",
        "# Select a small subset to speed up GAF generation\n",
        "selected_class = 0  # Normal beats (adjust as needed)\n",
        "num_samples = 3  # Reduce number of samples for fast processing\n",
        "selected_indices = np.where(y == selected_class)[0][:num_samples]\n",
        "X_selected = X[selected_indices]\n",
        "\n",
        "# Convert ECG signals to GAF images\n",
        "gaf = GramianAngularField(method='summation', image_size=164)  # Smaller image size for speed\n",
        "X_gaf = gaf.fit_transform(X_selected)  # Convert selected samples\n",
        "\n",
        "# Plot GAF images\n",
        "fig, axes = plt.subplots(1, num_samples, figsize=(10, 3))\n",
        "for i in range(num_samples):\n",
        "    sns.heatmap(X_gaf[i], cmap='gray', square=True, cbar=False, ax=axes[i])\n",
        "    axes[i].set_title(f\"GAF Image {i+1}\")\n",
        "\n",
        "    axes[i].axis('off')\n",
        "\n",
        "plt.show()\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 304
        },
        "id": "oqR9PhbwD_GB",
        "outputId": "9dc41893-8d14-4820-acf3-60abd4bf7350"
      },
      "execution_count": 27,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Dataset loaded successfully! Shape: (87554, 188)\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1000x300 with 3 Axes>"
            ],
            "image/png": "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8MADD8gdd9zhZrnValXe9KY3pYos//2///fy13/9197fK17xiisu+4/8yI+47YWFBTl69KiUy2V5y1ve4n4/evSoLCwsyFNPPeV+C8NQstnJYzEajeTChQtSqVTk6NGj8qUvfcmd9xd/8Reyb98+uffee91vURTJj/7oj3rl+MpXviJPPvmk/Ot//a/lwoULboWk1WrJv/pX/0r+9m//Vsbj8RXX0zC2M9aHbL8+pN1uy3333SfFYlF+8Rd/cfYGMYzrhPUj26cfed3rXid//dd/LR//+Mflx3/8x6VQKEir1dp6w7yIMK9TU4BXhmazueHYb/7mb0qj0ZAzZ87Iv/23/9Y7dvnyZfmzP/szeec73ylf//rX3e/f9m3fJp/4xCfkiSeekNtvv9275siRI/KGN7xhLuWOomiDl4h6vS779+/fYOtQr9fl0qVLbn88HssHP/hB+fVf/3V5+umnZTQauWPLy8tu+9lnn5Vbb711Q3pafPjkk0+KiMj999+fWt7V1VVZXFycsXaGceNgfcj26kNGo5H8wA/8gDz22GPy53/+57J3795NrzGM6431I9unH9m1a5fs2rVLRES+//u/X9773vfKXXfdJU8++aTs3r176rUvVmyiMYV6vS579uyRf/qnf9pwDHqSzzzzzIZjH//4x6XX68kHPvAB+cAHPrDh+AMPPCA/93M/N/fyglwut6Xf4zh22+9973vlv//3/y4//MM/LP/jf/wPWVpakmw2K//pP/2nK5I84Jpf+qVfkle+8pWJ5ySt0hjGzYD1IdurD/nRH/1R+fSnPy0PPPCAvP71r99yWQzjemD9yPbqR5jv//7vl5/92Z+VP/7jP5Yf+7Ef2/L1LwZsorEJb3rTm+TDH/6w/MM//IO8+tWvnumaBx54QF72spfJe97zng3HfvM3f1MefPDBq/pyvxD+4A/+QF73utfJb/3Wb3m/X7582fPccujQIXnsscckjmNvJYFXTUREbr31VhERqdVqc1slMYwbCetDJlzvPuTd7363fOQjH5Ff/dVfdYaxhnGjYP3IhOvdj2g6nY6ITKQhRjJmo7EJP/MzPyOlUkl++Id/WM6cObPhOM/ARSZRaP/2b/9W3vKWt8j3f//3b/h7xzveIV//+tfl4YcfvlZV2BK5XG5DnT7+8Y/LiRMnvN+++7u/W06cOCGf+tSn3G/d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\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 28,
      "metadata": {
        "id": "qHsPZ_uXtmuz"
      },
      "outputs": [],
      "source": [
        "# For exploratory purpose only\n",
        "gasf = GramianAngularField(image_size=164, method='summation')\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 29,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 80
        },
        "id": "l9OMnundtmuz",
        "outputId": "bba3bde7-cef3-493d-f90f-39c51b2e024a"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "GramianAngularField(image_size=187)"
            ],
            "text/html": [
              "<style>#sk-container-id-2 {\n",
              "  /* Definition of color scheme common for light and dark mode */\n",
              "  --sklearn-color-text: #000;\n",
              "  --sklearn-color-text-muted: #666;\n",
              "  --sklearn-color-line: gray;\n",
              "  /* Definition of color scheme for unfitted estimators */\n",
              "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
              "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
              "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
              "  --sklearn-color-unfitted-level-3: chocolate;\n",
              "  /* Definition of color scheme for fitted estimators */\n",
              "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
              "  --sklearn-color-fitted-level-1: #d4ebff;\n",
              "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
              "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
              "\n",
              "  /* Specific color for light theme */\n",
              "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
              "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
              "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
              "  --sklearn-color-icon: #696969;\n",
              "\n",
              "  @media (prefers-color-scheme: dark) {\n",
              "    /* Redefinition of color scheme for dark theme */\n",
              "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
              "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
              "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
              "    --sklearn-color-icon: #878787;\n",
              "  }\n",
              "}\n",
              "\n",
              "#sk-container-id-2 {\n",
              "  color: var(--sklearn-color-text);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 pre {\n",
              "  padding: 0;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 input.sk-hidden--visually {\n",
              "  border: 0;\n",
              "  clip: rect(1px 1px 1px 1px);\n",
              "  clip: rect(1px, 1px, 1px, 1px);\n",
              "  height: 1px;\n",
              "  margin: -1px;\n",
              "  overflow: hidden;\n",
              "  padding: 0;\n",
              "  position: absolute;\n",
              "  width: 1px;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-dashed-wrapped {\n",
              "  border: 1px dashed var(--sklearn-color-line);\n",
              "  margin: 0 0.4em 0.5em 0.4em;\n",
              "  box-sizing: border-box;\n",
              "  padding-bottom: 0.4em;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-container {\n",
              "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
              "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
              "     so we also need the `!important` here to be able to override the\n",
              "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
              "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
              "  display: inline-block !important;\n",
              "  position: relative;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-text-repr-fallback {\n",
              "  display: none;\n",
              "}\n",
              "\n",
              "div.sk-parallel-item,\n",
              "div.sk-serial,\n",
              "div.sk-item {\n",
              "  /* draw centered vertical line to link estimators */\n",
              "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
              "  background-size: 2px 100%;\n",
              "  background-repeat: no-repeat;\n",
              "  background-position: center center;\n",
              "}\n",
              "\n",
              "/* Parallel-specific style estimator block */\n",
              "\n",
              "#sk-container-id-2 div.sk-parallel-item::after {\n",
              "  content: \"\";\n",
              "  width: 100%;\n",
              "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
              "  flex-grow: 1;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-parallel {\n",
              "  display: flex;\n",
              "  align-items: stretch;\n",
              "  justify-content: center;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  position: relative;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-parallel-item {\n",
              "  display: flex;\n",
              "  flex-direction: column;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-parallel-item:first-child::after {\n",
              "  align-self: flex-end;\n",
              "  width: 50%;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-parallel-item:last-child::after {\n",
              "  align-self: flex-start;\n",
              "  width: 50%;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-parallel-item:only-child::after {\n",
              "  width: 0;\n",
              "}\n",
              "\n",
              "/* Serial-specific style estimator block */\n",
              "\n",
              "#sk-container-id-2 div.sk-serial {\n",
              "  display: flex;\n",
              "  flex-direction: column;\n",
              "  align-items: center;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  padding-right: 1em;\n",
              "  padding-left: 1em;\n",
              "}\n",
              "\n",
              "\n",
              "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
              "clickable and can be expanded/collapsed.\n",
              "- Pipeline and ColumnTransformer use this feature and define the default style\n",
              "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
              "*/\n",
              "\n",
              "/* Pipeline and ColumnTransformer style (default) */\n",
              "\n",
              "#sk-container-id-2 div.sk-toggleable {\n",
              "  /* Default theme specific background. It is overwritten whether we have a\n",
              "  specific estimator or a Pipeline/ColumnTransformer */\n",
              "  background-color: var(--sklearn-color-background);\n",
              "}\n",
              "\n",
              "/* Toggleable label */\n",
              "#sk-container-id-2 label.sk-toggleable__label {\n",
              "  cursor: pointer;\n",
              "  display: flex;\n",
              "  width: 100%;\n",
              "  margin-bottom: 0;\n",
              "  padding: 0.5em;\n",
              "  box-sizing: border-box;\n",
              "  text-align: center;\n",
              "  align-items: start;\n",
              "  justify-content: space-between;\n",
              "  gap: 0.5em;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 label.sk-toggleable__label .caption {\n",
              "  font-size: 0.6rem;\n",
              "  font-weight: lighter;\n",
              "  color: var(--sklearn-color-text-muted);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n",
              "  /* Arrow on the left of the label */\n",
              "  content: \"▸\";\n",
              "  float: left;\n",
              "  margin-right: 0.25em;\n",
              "  color: var(--sklearn-color-icon);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n",
              "  color: var(--sklearn-color-text);\n",
              "}\n",
              "\n",
              "/* Toggleable content - dropdown */\n",
              "\n",
              "#sk-container-id-2 div.sk-toggleable__content {\n",
              "  max-height: 0;\n",
              "  max-width: 0;\n",
              "  overflow: hidden;\n",
              "  text-align: left;\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-toggleable__content.fitted {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-toggleable__content pre {\n",
              "  margin: 0.2em;\n",
              "  border-radius: 0.25em;\n",
              "  color: var(--sklearn-color-text);\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
              "  /* Expand drop-down */\n",
              "  max-height: 200px;\n",
              "  max-width: 100%;\n",
              "  overflow: auto;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
              "  content: \"▾\";\n",
              "}\n",
              "\n",
              "/* Pipeline/ColumnTransformer-specific style */\n",
              "\n",
              "#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Estimator-specific style */\n",
              "\n",
              "/* Colorize estimator box */\n",
              "#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n",
              "#sk-container-id-2 div.sk-label label {\n",
              "  /* The background is the default theme color */\n",
              "  color: var(--sklearn-color-text-on-default-background);\n",
              "}\n",
              "\n",
              "/* On hover, darken the color of the background */\n",
              "#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "/* Label box, darken color on hover, fitted */\n",
              "#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Estimator label */\n",
              "\n",
              "#sk-container-id-2 div.sk-label label {\n",
              "  font-family: monospace;\n",
              "  font-weight: bold;\n",
              "  display: inline-block;\n",
              "  line-height: 1.2em;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-label-container {\n",
              "  text-align: center;\n",
              "}\n",
              "\n",
              "/* Estimator-specific */\n",
              "#sk-container-id-2 div.sk-estimator {\n",
              "  font-family: monospace;\n",
              "  border: 1px dotted var(--sklearn-color-border-box);\n",
              "  border-radius: 0.25em;\n",
              "  box-sizing: border-box;\n",
              "  margin-bottom: 0.5em;\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-estimator.fitted {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "/* on hover */\n",
              "#sk-container-id-2 div.sk-estimator:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-2 div.sk-estimator.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
              "\n",
              "/* Common style for \"i\" and \"?\" */\n",
              "\n",
              ".sk-estimator-doc-link,\n",
              "a:link.sk-estimator-doc-link,\n",
              "a:visited.sk-estimator-doc-link {\n",
              "  float: right;\n",
              "  font-size: smaller;\n",
              "  line-height: 1em;\n",
              "  font-family: monospace;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  border-radius: 1em;\n",
              "  height: 1em;\n",
              "  width: 1em;\n",
              "  text-decoration: none !important;\n",
              "  margin-left: 0.5em;\n",
              "  text-align: center;\n",
              "  /* unfitted */\n",
              "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-unfitted-level-1);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link.fitted,\n",
              "a:link.sk-estimator-doc-link.fitted,\n",
              "a:visited.sk-estimator-doc-link.fitted {\n",
              "  /* fitted */\n",
              "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-fitted-level-1);\n",
              "}\n",
              "\n",
              "/* On hover */\n",
              "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
              ".sk-estimator-doc-link:hover,\n",
              "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
              ".sk-estimator-doc-link:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
              ".sk-estimator-doc-link.fitted:hover,\n",
              "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
              ".sk-estimator-doc-link.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "/* Span, style for the box shown on hovering the info icon */\n",
              ".sk-estimator-doc-link span {\n",
              "  display: none;\n",
              "  z-index: 9999;\n",
              "  position: relative;\n",
              "  font-weight: normal;\n",
              "  right: .2ex;\n",
              "  padding: .5ex;\n",
              "  margin: .5ex;\n",
              "  width: min-content;\n",
              "  min-width: 20ex;\n",
              "  max-width: 50ex;\n",
              "  color: var(--sklearn-color-text);\n",
              "  box-shadow: 2pt 2pt 4pt #999;\n",
              "  /* unfitted */\n",
              "  background: var(--sklearn-color-unfitted-level-0);\n",
              "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link.fitted span {\n",
              "  /* fitted */\n",
              "  background: var(--sklearn-color-fitted-level-0);\n",
              "  border: var(--sklearn-color-fitted-level-3);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link:hover span {\n",
              "  display: block;\n",
              "}\n",
              "\n",
              "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
              "\n",
              "#sk-container-id-2 a.estimator_doc_link {\n",
              "  float: right;\n",
              "  font-size: 1rem;\n",
              "  line-height: 1em;\n",
              "  font-family: monospace;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  border-radius: 1rem;\n",
              "  height: 1rem;\n",
              "  width: 1rem;\n",
              "  text-decoration: none;\n",
              "  /* unfitted */\n",
              "  color: var(--sklearn-color-unfitted-level-1);\n",
              "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 a.estimator_doc_link.fitted {\n",
              "  /* fitted */\n",
              "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-fitted-level-1);\n",
              "}\n",
              "\n",
              "/* On hover */\n",
              "#sk-container-id-2 a.estimator_doc_link:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "#sk-container-id-2 a.estimator_doc_link.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-3);\n",
              "}\n",
              "</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GramianAngularField(image_size=187)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator  sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" checked><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label  sk-toggleable__label-arrow\"><div><div>GramianAngularField</div></div><div><span class=\"sk-estimator-doc-link \">i<span>Not fitted</span></span></div></label><div class=\"sk-toggleable__content \"><pre>GramianAngularField(image_size=187)</pre></div> </div></div></div></div>"
            ]
          },
          "metadata": {},
          "execution_count": 29
        }
      ],
      "source": [
        "gasf"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "xdjE_aaztmu0",
        "outputId": "2f272928-7e0f-4854-b618-f7392bdba5d5"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "pyts.image.gaf.GramianAngularField"
            ]
          },
          "execution_count": 16,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "type(gasf)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "bVLKyIiLtmu0",
        "outputId": "4d83ef09-7cd1-48ff-d784-80a0f4c977bc"
      },
      "outputs": [
        {
          "ename": "AttributeError",
          "evalue": "'GramianAngularField' object has no attribute 'shape'",
          "output_type": "error",
          "traceback": [
            "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
            "\u001b[1;31mAttributeError\u001b[0m                            Traceback (most recent call last)",
            "\u001b[1;32m<ipython-input-17-e24f15377b52>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mgasf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
            "\u001b[1;31mAttributeError\u001b[0m: 'GramianAngularField' object has no attribute 'shape'"
          ]
        }
      ],
      "source": [
        "gasf.shape"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "Hvublfywtmu0"
      },
      "outputs": [],
      "source": [
        "x_gasf_train = gasf.fit_transform(x_train)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "r8x4uLl9tmu0",
        "outputId": "42f89159-3e7e-4d78-9e1f-6b76fa7ba793"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "(87554, 187, 187)"
            ]
          },
          "execution_count": 19,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "x_gasf_train.shape"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "gfZvJWk4tmu0"
      },
      "outputs": [],
      "source": [
        "x_gasf_test = gasf.transform(x_test)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "fLwyrxsxtmu0",
        "outputId": "17f4a09b-f394-435d-8d4d-17007fda5533"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "array([[ 0.28965888,  0.12514941,  0.00677734, ..., -0.80301273,\n",
              "        -0.80301273, -0.80301273],\n",
              "       [ 0.12514941, -0.04290041, -0.16091198, ..., -0.69177294,\n",
              "        -0.69177294, -0.69177294],\n",
              "       [ 0.00677734, -0.16091198, -0.27665898, ..., -0.60139048,\n",
              "        -0.60139048, -0.60139048],\n",
              "       ...,\n",
              "       [-0.80301273, -0.69177294, -0.60139048, ...,  1.        ,\n",
              "         1.        ,  1.        ],\n",
              "       [-0.80301273, -0.69177294, -0.60139048, ...,  1.        ,\n",
              "         1.        ,  1.        ],\n",
              "       [-0.80301273, -0.69177294, -0.60139048, ...,  1.        ,\n",
              "         1.        ,  1.        ]])"
            ]
          },
          "execution_count": 20,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "x_gasf_train[87553]"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "CQELF7L5tmu0",
        "outputId": "9ea576d6-636b-4596-98e9-141fae36f944"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "(187,)"
            ]
          },
          "execution_count": 21,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "x_train.values[87553, :].shape"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "KJwtgOsftmu0",
        "outputId": "80eb6752-c1af-4858-893d-624eeda5a305"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "[<matplotlib.lines.Line2D at 0x29d8414ccc8>]"
            ]
          },
          "execution_count": 22,
          "metadata": {},
          "output_type": "execute_result"
        },
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD4CAYAAAD8Zh1EAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO3deXScd33v8fd3Vm0zWkdeZcmLYsd2SOIozkYWmgUnhbgsCQlNgbIEelkLbUkPELhwbstSoJfbQEgpEFJIQoCCCw4mJQkESBzbsbN4izfZli1bm7UvM6P53T+eGXkkjTxjeWaeWb6vc3Q8eubRM78zlj766fv8FjHGoJRSKv857G6AUkqp9NBAV0qpAqGBrpRSBUIDXSmlCoQGulJKFQiXXS9cV1dnmpqa7Hp5pZTKS9u2besyxgQSPWdboDc1NbF161a7Xl4ppfKSiBye6TktuSilVIHQQFdKqQKhga6UUgVCA10ppQqEBrpSShWIpIEuIt8VkQ4ReWWG50VEviEi+0XkJRFZk/5mKqWUSiaVHvr3gXVneP5moDn6cTfwrXNvllJKqbOVNNCNMb8Hes5wynrgB8byHFAlIvPS1UClcs0vdhyjbyRkdzOUmiYdNfQFwNG4z9uix6YRkbtFZKuIbO3s7EzDSyuVXW2nhvnoIzv42QttdjdFqWnSEeiS4FjCXTOMMQ8YY1qMMS2BQMKZq0rltPa+0Un/KpVL0hHobUBD3OcLgeNpuK5SOUcDXeWydAT6BuAd0dEulwN9xpj2NFxXqZxzMhrkJzXQVQ5KujiXiDwMXAfUiUgb8FnADWCMuR/YCNwC7AeGgb/OVGOVstuJ/tFJ/yqVS5IGujHmziTPG+CDaWuRUjksPtCNMYgkuoWklD10pqhSZ+FEtNQSDEc4NaxDF1Vu0UBX6iyc6BulzOOceKxULtFAVypFkYihY2CUCxZUAnCif8TmFik1mQa6UinqGQ4SGjdctKgKgBN9Yza3SKnJNNCVSlGsxPKaBVWI6EgXlXs00JVKUSzQF1SXUlfh5USfllxUbtFAVypFsR75XH8Jc/0lnOjXkovKLRroSqXoZP8oTocQ8HmZW1mis0VVztFAVypF7X2jBCq8OB3CXH8J7VpyUTlGA12pFHUMjDHH7wVgbmUJ/aNhhsbCNrdKqdM00JVK0WhwnDKPtVpGQ00ZAEdPDdvZJKUm0UBXKkVj4XFK3NaPTGM00A93a6Cr3JF3gW6MoXc4aHczVBEaDUXwuqxp/0215QAc0UBXOSTvAv2bTx/g4i88wWho3O6mqCIzFh7HG+2hV5a5qSx1c7hnyOZWKXVa3gX6wupSjIEjPdozUtk1Fo7gdZ3+kWmsLdOSi8opeRfoS+oqADjYqT0jlV1WoDsnPl9Uo4GuckveBXpTnXUz6lCXBrrKrrHQ+LQe+rHeEULjERtbpdRpeRfovhI3AZ+XQ12DdjdFFZmxcGSihg7QWFvOeMRwvFcnGKnckHeBDrC4rlx76CqrwuMRwhEzqeSiQxdVrsnLQF+iga6yLBgtq0wuuVhDFw/rDXqVI/Iy0BfXldM1GKRvRPd0VNkxFpoe6PU+L16XgyPd2rlQuSFvAx2gVXvpKkvGwtFAd58uuTgcoiNdVE7Jy0BfErCGLmrZRWVLbCJbiXvyj8zC6lKO6U1RlSPyMtAX1ZThEDioga6yZKKHHndTFKzdi3SUi8oVeRnoHpeDhpoyDnTq0EWVHWNhq4ceX0MHmF9VyqnhEMNBXUZX2S8vAx2gud7H3hMDdjdDFYkZe+hVpQAcO6W9dGW/vA30lfN8HOwc1EW6VFZMjHJJUEMHaNOyi8oBeRvo58/zEzHw6kntpavMm6nksqDKmlykdXSVC/I60AF2t/fb3BJVDGYquQR8XlwO0ZKLygl5G+iLasoo9zjZ3a49dJV5M/XQnQ5hXlWJDl1UOSFvA93hEJbP9WkPXWXFTDV0sG6Mag9d5YKUAl1E1onIXhHZLyL3JHh+kYg8JSLbReQlEbkl/U2d7vx5fna392OMycbLqSI2U8kFrKGLWkNXuSBpoIuIE7gPuBlYCdwpIiunnPZp4MfGmIuBO4BvpruhiZw/z0//aJjjfaPZeDlVxGaaKQqwsKqUE/2jui66sl0qPfS1wH5jzEFjTBB4BFg/5RwD+KOPK4Hj6WvizCZujB7XsovKrFgP3eNMUHKpLiVi4IR2LJTNUgn0BcDRuM/bosfifQ64S0TagI3AhxNdSETuFpGtIrK1s7NzFs2drHmOtabLfp0xqjJsLDyOyyG4EgV6dOii3hhVdksl0CXBsalF6zuB7xtjFgK3AA+JyLRrG2MeMMa0GGNaAoHA2bd2Cn+Jm3qfl/0dGugqs8ZCkWkjXGLmV5UAOhZd2S+VQG8DGuI+X8j0ksp7gB8DGGOeBUqAunQ0MJmlgQpd00VlnLX93PQbomDdFAWd/q/sl0qgbwGaRWSxiHiwbnpumHLOEeB6ABE5HyvQz72mkoJl9RXs7xjUkS4qo8bC4zP20EvcTuoqvFpyUbZLGujGmDDwIWATsBtrNMtOEfm8iNwaPe0TwPtE5EXgYeBdJksJuzRQzsBomM6BsWy8nCpSY+GZSy5g3RjVQFd2c6VykjFmI9bNzvhj98Y93gVcld6mpWZZvQ+wbozW+0vsaELWRSKG1u4hFlaX4TlDyKj0sWroiUsuAAuqStijq38qm6UU6LlsWb010uVAxyBXLs1K2d4WkYjhly+38+Tukzyzr4vuoSCrF/j5zjsuZW5lcfwis9NYeDzhLNGYBVWlPLmnA2MMIonGESiVeXnfvZvj91LhdRX8SJd//e0+PvLwdp7Z18U15wX45LoVHOocYv19f2B/h/YMMy1pyaWqlNFQhO6hYBZbpdRked9DFxGWBso50Fm429Ftbe3h357cx5suXsBXb7sQh8PqAV63PMA7vvs8b/v2c/zwfZexYq4/yZXUbI2Gxin3zvzjsqA6Ohb91Ah1Fd5sNUupSfK+hw6wNDrSpRAd7h7iww9vZ2F1GZ9fv2oizMGaKfvI3ZfjcgofeGibTj3PoGQ9dB2LrnJBQQT64tpyTvSPMhIsrN2LWruGeNu3n2MkNM79d12Cr8Q97ZylgQr+6U0X0No9zI+3Hk1wFZUOVqDPfFN0oc4WVTmgIAJ9Ua31w3T01LDNLUkfYwz/8NOXGA2P8/D7Lmfl/JnLKX+2op6Wxmq+8dt9BfdLLVecaRw6gL/URYXXRZtOLlI2KoxAr7EC/Uh34QT6/+zu4PlDPXzipuUTi5DNRET4h3UrONk/xoPPtmalfcVmLBQ54ygXEWG+bnShbFYQgd5YWw7A4Z7CCPTweIQvPr6bJYFy7ri0IfkXAGsX13Dd8gDfevoAfSOhDLew+CQruYA10kVr6MpOBRHo1WVufF4XRwsk0B967jAHOof45LoVuBOs7jeTv7tpOX0jIR74/YEMtq44JSu5gM4WVfYriEAXERpqyjjcnf9DFzsHxvjab17l6uY6blo556y+dvWCSt544Xy++4dWBsfCGWph8THGJB3lAhCoKKF3OKSjjZRtCiLQARpryzhSAD30f9m0l9HwOJ+7ddWsZhy+fe0iRkLj/GFfVtZGKwqhcYMxzLjaYkxNhQeAU8M6uUjZo2ACfVFNGUdPjRCJ5O+qi92DY/xsextvX7uIpYGKWV2jpakaf4mL3+7uSHPritdY2Bo5lKyHXlNmBXqPzhZVNimcQK8tIxiOcHIgf7cB++kLbYTGDXdd3jjra7idDq5dXs9Tezvy+pdbLhkNRTeITtZDL48G+qAGurJH4QR6ng9dNMbw8PNHaWmspnmO75yudf2KeroGg7zY1pum1hW3VHvotdGSS4+WXJRNCibQG2vye+jiswe7OdQ1xJ1rF53zta5bHsAhaNklTWIbRCcL9GotuSibFUygz6sqwemQvBy6GIkY/mXTXuoqPNxywbxzvl5VmYfLFtey4cXjWnZJg7FYySXJOPTqMmtphm4tuSibFEygu50O5vrzc6bez7Yf44UjvXxy3QpKPWcOjVTdsbaBIz3D/OlAd1quV8wmSi5nmCkK4HI6qCpz6ygXZZuCCXSAgM+bd1vRDY6F+eLju1mzqIq3rFmYtuu+ftVcqsrcPLzlSNquWaxSLbmANdJF10RXdtFAt9n3/nCIrsEgn33j5KVxz1WJ28mbL17Ib3aeoHswv96TXHM60JP/9VRT7tFRLso2BRXo9XkW6H0jIf79mYPccP4cLmyoSvv171jbQGjc8KuX29N+7WIyFkptlAtYga4lF2WXggr0gM9L91Awb6Ze/8czB+kfDfO3NzZn5PrnzfGxpK6cJ3adzMj1i0Wsh16SpIYOVqBryUXZpaACvd5n7RqTD6MMXjnWx7d+d4BbL5zPqvmVGXudG1fN4dkD3boC4znoipas/Ak2GJmqptzDqaEgxujoIpV9BRXoAZ+1l2NHjs8WHQ6G+cjD26kt9/L59asy+lo3rZxDOGJ4eq+OSZ+tF470Mq+yhHp/SdJza8o9hCOG/lFdHE1lX0EFen000HO9jn7fU/s52DXE1952IVXRySiZclFDNXUVXi27nINtrT2saaxO6dyJ6f9adlE2KKhAP91Dz91Ab+8b4TvPHGL9RfO5cmldxl/P6RBuXFnPU3s6GA5qr/FsHe8d4XjfKC1nHei5+z2oCldBBXpdRe730L/2m1cxxtqMIlvevGYhQ8FxfvmSjnY5W1sPnwKgpbEmpfNPB7res1DZV1CB7nE5qC5z52wN/YldJ3lsWxvvuqqJhuhiYtnQ0ljNsvoKHn5eJxmdrW2tPZR5nJw/L7UF07SHruxUUIEO1kiXXOyhH+wc5OOP7uCCBZV8/MbzsvraIsIdlzaw/Ugve070Z/W188nu9n7+9tEdXPXFJ/neHw8xFh5n86EeLmqowpXiVoC15dZfiTp0Udmh4AI94PPmXA09PB7hI49sx+UU7v+rSyhJsq52JrxlzUI8Tgc/3tKW9dfOByPBcd727Wd5YtdJ6nxe/vd/72L1Zzex58QA154XSPk6pR4nJW4HpzTQlQ1cdjcg3ep9Xp5vza29Rb/zh0O8cqyfb/7lGhZUldrShupyD9cuD/D4K+18+s/PT+syA4Vg084T9I+GeeTuy7lscQ2PbWtjd3s/Vy6t4/oV9Wd1rdpyr/bQlS1S6qGLyDoR2Ssi+0XknhnOuV1EdonIThH5UXqbmbpYDz1XJnbs7xjg60+8yutXzeHm1XNtbcvNq+fS3jeqG18k8Ni2oyyqKWNtUw0iwu0tDXz2jau4ceWcs/7lV1Pu0WGLyhZJA11EnMB9wM3ASuBOEVk55Zxm4B+Bq4wxq4CPZaCtKQn4vATDkZyY2NE/GuLuh7bhK3HxhfWrZ7Xpczpdf/4c3E7h8VdO2NqOXNN2ylpm+C1rFqblL5fq6GxRpbItlR76WmC/MeagMSYIPAKsn3LO+4D7jDGnAIwxtk1LDExMLrJ3pMt4xPDxR3dwpHuY+96+JqVZhplWWermyqV1PP5Ke878BWO3oz3DfOq/XsEYePOaBWm5Zq2u56JskkqgLwCOxn3eFj0W7zzgPBH5o4g8JyLrEl1IRO4Wka0isrWzs3N2LU4itp6LnTdGjTF8bsNO/md3B/e+cSWXLam1rS1T3bx6Lkd7Rnj5WJ/dTbFd26lhbvr673n+UA+f/vPz0zaUVEsuyi6pBHqiv0Gndu9cQDNwHXAn8B0RmbYerDHmAWNMizGmJRBIfeTA2QjkwPT/bz59gIeeO8z7r1nCO65osq0didy8eh4el4OfbNPRLr97tZOR0Dg//Zsree/VS9J23ZpyD8PBcUajy+4qlS2pBHob0BD3+ULgeIJzfmGMCRljDgF7sQI+6+r99gb6Y1uP8pVNe/mLi+bzyXUrbGnDmVSWubl59Vx+vv1Y0QfO5oM91Pu8KU8aSpWu56LskkqgbwGaRWSxiHiAO4ANU875OfA6ABGpwyrBHExnQ1Pl87rwuhy2lFwef7mde372Mq9dVseX33phzg4NvL2lgf7RMJt2Fu/NUWMMmw91c9mS2rTfrNZAV3ZJGujGmDDwIWATsBv4sTFmp4h8XkRujZ62CegWkV3AU8DfG2Ns2Z1YRGzZim7jy+186OHtXNRQxbfuWoMnhd1t7HLFkloaakp5dMvR5CcXqMPdw5zsH+Oyxamt0XI2NNCVXVKaWGSM2QhsnHLs3rjHBvh49MN29T5vVtdzid0EXT3fz4PvXkuFN7fnazkcwm2XNPC1J17lSPcwi2qzt65Mrth8yOpvXL5EA10VjtztRp6DbPfQ95wYoGNgjLsub8z5MI956yULEbEm1BSjzQd7qKvwsDRQkfZr12qgK5sUZKDX+0qyWkN/Zp81BPPq5syM3MmE+VWlXNMc4Cfb2hiPFNeY9C2tPfzq5Xaubg5kZLKXv8SN0yEa6CrrCjLQAz4vvcMhxsLZGcXxzL4uzptTwdxK+ycPnY3bWxpo7xvlqT3Fsz3dgc5B3vvgVhZUlfKZN6xM/gWz4HAI1WVunVyksq4gAz22FV1XFjaLHglaS6xek0e985gbVtbTUFPKJx57kZfbimOi0f/51W6MMTz47rUTte5MqNHp/8oGBRno2Zxc9HxrD8FwhKvPYonVXOF1OfnRey/HV+Li7d95jt3thb1W+gtHTvHkng7ef+3SjG8wUl2ms0VV9hVkoE9M/+/P/EiXFw6fwiGwtin9oyWyoaGmjEfuvpxyj4t3fe95jvWO2N2kWQmNR/jDvi6C4ci05472DLPhxeP888bd1JZ7eNeVTRlvT22Fh27dtUhlWX4MyThLEz30wcz/QB3qGmJBdSmlnuxvWpEuC6vL+P67L+W2+59l3b/+nttbGvjwny2jqixzJYmpRkPj7Ds5iAgsriunPMFooWA4wr8/c5DqMg93rm3gQOcQu9r7WTnPx72/2MmfDnTTVFvGGy+cT0f/GFc117GwupR3fvd5BqKrb37mDSsTXjvdaso9nBrWfUVVdhVkoNdWeBCBjv7MB3pr9xBNteUZf51MWzHXz2MfuIJvPnWAB//UyrbDp/jR+y6jzJOZb5FTQ0G+vGkvC6tLed3yej74oxc41GVtTOJ2CpcvqeWj1zfTMTDGFx/fwxy/l8Gx8Ymy0A+ebWVfx+DECB2P08FHr2/m16+c4P89uR9/iYtHtx5FBBqqy3joPZdRVeqmMUtj7mvKPJwaDjIeMThzdMawKjwFGehup4OaMk/Ge+jGGA51DvGmNC27arcVc/18486L+fPXzONv/nMbb/3Ws5R5nLxuRT0ffN2yWV3z16+088PNR/jAtUvpGQryg2db8ZW4eeVYH91DVuB9ZdNeaso9fO32CynzONl+pJef7zjGW+9/FoCV8/yMhSMMjIa4/65L6Boc4+tPvMpdly3i1osW8OLRXlqaqnnNwio+dkMzwfEILoeDn73QxlN7O/jMG1YyrzK7O0XVlHswBnqHg9RWeLP62qp4FWSgQ3Tnogz30LuHggyMhQuihx7v9avm8sU3v4b7f3+AiLEC1yHCiugiVtedF+DZg9188fE9/NObLmD1gsqE1/nT/i4+/PB2jLGGdgIsCZQzODZOQ00Z3/vrSxkcDfPzHcf5X9edvlG5bvU8PnpDM9/7Yysi8L6rl+CesknzXZc3Tjy+pLF64rGI4HVZ5a/bWhq4raUBO9REQ/yUBrrKooIO9Ez30FujJYLFgcIKdIDbL23g9ksbiEQMH354O1/69Z6J59ZfNJ8nd3cwMBbm/Q9t4yd/cwVHe0aYV1lCOGL4+8deZNuRUxgD582p4D/fexmbdp6kwuvk1gsXTCtBJFovvszjmvVfBbmguswNQM+Q1tFV9hRsoNf7SjjQ0ZXR1zgYC/QC66HHcziEr95+IZc0VrOsvoI/Huji2787yFx/CV+57UI+8sh2rvjnJyfOdzqEco+T91+zlHKPk7dd2kC9r4S/iutRF4PKUivQ+0Y00FX2FGygx3roxpiM7eXZ2jWEyyEsrM5ufTbbStxO3v3axQBcc16Aa5oDLKopo6GmjH+782KeO9jD2sU1HO8d4VjvCO+9enHWa9a5Jhbo/RroKosKNtDrfV5C44be4RDVGZoR2No9RENNGS5nQQ7nn9FVy+omHt+0ai43rZprY2tyk79Ee+gq+wo2ibIxFv1Q1zCL6wq33KJmz68lF2WDgg302HoumRrpYoyhtaswxqCr9HM6BJ/XRf+oBrrKnoIN9NM99MxM/2/vG2UkNF6QI1xUevhL3dpDV1lVsIFe74+t55KZHnpsxuL5c9O7wbAqHP5SN/0jYbuboYpIwQZ6ucdJqduZsRUXdx7vRwRWzPNn5Poq/1WWunSUi8qqgg10EaHe783YzkW7jvfTVFueN1vOqezzl2jJRWVXwQY6QKAic3uLWqv8ae9czayy1K03RVVWFXSgWz309N8U7R8NcaRnmJXzNdDVzCr1pqjKsoIO9Ez10Pe0DwBoD12dkb/UzXBwnND49E03lMqEgg70en8J/aNhRkPp3Sx613Fr/03toasz0en/KtsKOtADFZnZW3RXez91FZ6JyUtKJeIvtW6Ya9lFZUthB7o/Ols0jYFujOGP+7u5qKEqY4t+qcKgKy6qbCvsQM9AD/2FI70c6x3h5tXz0nZNVZgmSi6jOrlIZUdBB3q9Pxbo6Rvp8suXjuNxOrhx1Zy0XVMVJl1xUWVbQQd6bbkXj8tBa/dwWq4XiRg2vtzOtcsDEz+sSs1Eb4qqbCvoQHc6hIsbqth8qDst19vS2sPJ/jHe8Bott6jkdAldlW0FHegAVyytZefxfnqHg+d8rd/u6cDtFK4/X8stKrkStxOPy6E9dJU1KQW6iKwTkb0isl9E7jnDeW8VESMiLelr4rm5cmkdxsDmQz0pnT8wGuKfN+7mnp++xEPPthKOmxTy9N4O1i6u0fVbVMp0+r/KpqTJJCJO4D7gRqAN2CIiG4wxu6ac5wM+AmzORENn68KGSkrcDp49YA01BJgTXVp3qn0nB/jr72/heO8I1WUeHtlyFIdD+MvLGjneO8KrJwe57ZKGbDZf5Tl/iUtLLiprUumhrwX2G2MOGmOCwCPA+gTnfQH4MpCZHSVmyety0tJYw69ebuf6r/6O9z64dcZzf/DsYboHgzz2gSvY+ukbuKihivt/d4DweISn93YCcN3yQLaargqArueisimVQF8AHI37vC16bIKIXAw0GGN+eaYLicjdIrJVRLZ2dnaedWNn64qltXQOjBEaj/DysT66ZthntL1vlMbaMi5prEFE+ODrlnG0Z4Rf7DjOU3s7WFBVyrL6iqy1W+W/ygxscjEcDPOLHcfSek1VGFIJ9ETTIc3EkyIO4OvAJ5JdyBjzgDGmxRjTEghkr6d71+WNfOYNK/neuy4F4E8HEo96Odk/Oqkcc/2KepbP8fGJx17kiV0nuXZ5QGeHqrOSiW3ofrT5CB99ZAdHe9IzHFcVjlTu7rUB8YXjhcDxuM99wGrg6WjYzQU2iMitxpiZ6xtZVFnq5j2vXcx4xOArcfGn/V3ceuH8aeed6B/l/Hmnt5RzOIT/e+dF/HZ3ByLwposXTPsapc4kEzdFt7aeAmAsnN5F51T+SyXQtwDNIrIYOAbcAbw99qQxpg+oi30uIk8Df5crYR7P6RCuXFrLM/u6MMZM6m2HxiN0DY4xd8oN0xVz/ayYq6sqqtmxSi4hIhGDw3Huf90ZY9h62Ar00LhJcrYqNklLLsaYMPAhYBOwG/ixMWaniHxeRG7NdAPT7apldRzrHeHIlD9XuwbHMAbmVCYeAaPUbPhL3EQMDAbTU0c/0jM8cQ8orIGupkhpQLUxZiOwccqxe2c497pzb1bmXLnU+mNi86EeGmvLJ46f6LMG50ztoSt1LuKn/6djuYht0d45QFA3zlBTFPxM0akaa8sQgeO9I5OOn+y3An2mMepKzUa610TfGhfoYQ10NUXRBbrb6aC23DNtjfSJHrqWXFQapXM9F2MMW1t78EVnKmsNXU1VdIEOEPCV0NE/ef7Tif4x3E6hpsxjU6tUITpdcjm3GvqpoSAf+M9tvHpykGujk9tCEe2hq8mKMtDrfd5pPfST/aPU+0rSMhJBqZhY3fxcF+j63H/v5Mk9HfzjzSu4+5olgN4UVdMVZaDP8XsnauYxJ/pGtdyi0q6y7NxLLuMRw1N7OviLixbw/muX4nFZP7YhraGrKYoy0Ot9JXQNBhmPnO7hnOwf1REuKu0qPC4cwjlNLnqprZf+0TDXnGeVWtxODXSVWFEG+hy/l/GIoXvIKrsYYzgxZdq/UungcAi+knOb/v/7V7sQgdcus4bcuh2xQNeSi5qsKAM94LOCu6PfCvTBsTDDwXHmVnrtbJYqULHZorP1zL5OXrOgkupy64a922Xd59Fhi2qqogz02ObRHdHNo3UMusokf+ns10TvHw2x/WgvVzefXszOFeuhR7SHriYrykCPBXeshx77t96nga7S71zWRN/WeorxiOGqZRPLJeF2Wj30UFh76Gqyogz0QEWsh24FeWd0bYyAT0suKv2sFRdnNw5978kBAFbOP71AXOymaFjHoaspijLQPS4HNeWeiVJL54AGusoc/zncFN13cpA5fu/EBCUAV6yHrjdF1RRFGegweXJR58AYHpcDf4lu/qzS71xKLvs6Bmiu9006dnqUi/bQ1WRFG+gBn3di+n/nwBiBCq/uRqQywl/qJhiOMBo6uw0pIhHD/o5BmudM3vbQ4RCcDtGZomqaog30Of6SSTV0LbeoTPGXzm76/7HeEYaD49N66AAuh2gPXU1TtIFe7/PSOTBGJGKsHroGusqQiQW6znK26L4O64bo1B46gMfp0Bq6mqZoA31BdSnhiKG9f5TOgTHqNdBVhlTOcgndfScHAWiunx7oLqfoKBc1TdEG+rKA9UOyp72fnuGg9tBVxsRutp9toL96cpCAz0tVgiWdXU6HllzUNMUb6NFez+ZDPRijQxZV5sx2TfT9HQOcl6DcAlpyUYkVbaDXVnipKffwpwNdwOnJRkql22x3LTrcM0xT3L638VxOvSmqpivaQAer7LLzeD+gPXSVObOpoTdULZ8AAAzrSURBVEcihr6RELXliXfQcjsdOmxRTVPcgT6nAhP9mdBAV5nidjrwlbjoHhxLfnLUwGgYY0737qfSYYsqkeIO9MDp+mSdllxUBgUqvHQNBlM+v3fEOjfRDVGwfklooKupijrQY+N7/SUuStxOm1ujClldhXdiEbhUxMozVTP00N1OIazL56opijrQYyNdtNyiMq3O5zmrkkvvsBXosT1Jp3I5HQR1+Vw1RVEH+lx/CRVelwa6yri6sy65nLmH7nE6tIeupinq5QVFhFsvmk9DdZndTVEFrrbcS99IiGA4gseVvB8VK7nM3EMXwqPaQ1eTFXWgA/zTmy6wuwmqCNT5rJub3UNjzKssTXp+37DVm6+ccZSLg6AOW1RTFHXJRalsiY2i6hpIrezSOxyi1O3E60p8s97jEt0kWk2jga5UFkwEeoo3RvtGQlTNUG4Bq4euwxbVVCkFuoisE5G9IrJfRO5J8PzHRWSXiLwkIr8Vkcb0N1Wp/BVbWiLVoYu9I6EZyy0QG4euJRc1WdJAFxEncB9wM7ASuFNEVk45bTvQYox5DfAT4MvpbqhS+Wyihp7iSJe+4WSBrsvnqulS6aGvBfYbYw4aY4LAI8D6+BOMMU8ZY4ajnz4HLExvM5XKb2UeF2UeZ/pKLk7RHrqaJpVAXwAcjfu8LXpsJu8BHk/0hIjcLSJbRWRrZ2dn6q1UqgDUVnhSDvTekSBVpYmn/YNO/VeJpRLoiXZOTtg1EJG7gBbgK4meN8Y8YIxpMca0BAKB1FupVAGwJhelGOjDoRnHoIMGukoslUBvAxriPl8IHJ96kojcAHwKuNUYk/ocZ6WKRF2FN6Vhi6OhccbCkTPW0F0O0eVz1TSpBPoWoFlEFouIB7gD2BB/gohcDHwbK8w70t9MpfJfqj30iYW5kvTQwxGDMRrq6rSkgW6MCQMfAjYBu4EfG2N2isjnReTW6GlfASqAx0Rkh4hsmOFyShWtQIWHnuFg0glBEwtzJRnlAuiNUTVJSlP/jTEbgY1Tjt0b9/iGNLdLqYJT5/NiDPQMBan3l8x43umlc898UxQgHIng0fmBKkq/E5TKkvPm+ADY0nrqjOf1Dsc2tzjTsEXrRzcU1h66Ok0DXaksubSphtpyD4+/0n7G82JL56ZUctHJRSqOBrpSWeJ0CDetmsNTezoYDY3PeF5/kqVzIa7kojV0FUcDXaksWrd6HkPBcZ7Z1zXjOb3DIZwOweed+RaXyxG7Kao9dHWaBrpSWXTFklr8Ja4zll16R4L4S1yIJJrTZ4ltkqGBruJpoCuVRR6Xg2uX1/OHfV0zjiHvGwlTVTbzCBewls8FHbaoJtNAVyrL1i6uoWNgjCM9wwmf7x0OnvGGKFiLc4H20NVkGuhKZdnaphoAnj/Uk/D5ZCstgrVJNKAbRatJNNCVyrLm+goqS91saZ050LWHrmZDA12pLHM4hEubqmecYNQ7HKIqSaDHhi1qoKt4GuhK2eDSphoOdQ3RMTA66XgkYugfDVGZ5KaoruWiEtFAV8oGly626uhbp/TSB0bDGHPmWaJwepRLsoW+VHHRQFfKBqvm+3EI7DkxMOl470h0HZeUSy7aQ1enaaArZQOvy0lDTRkHOgcnHY8tnZtslItbb4qqBDTQlbLJ0kAFBzomB3pfCgtzwenVFsO6OJeKo4GulE2WBso51DVEJG4seW8KuxWB3hRViWmgK2WTJYEKxsIRjvWOTBzri66FXnmGzS1Ahy2qxDTQlbLJ0kAFwKQ6eqolF10+VyWiga6UTZYGygE40Dk0cax3OESZxzmxmuJMdKaoSkQDXSmb1JR7qCx1c3BKDz3ZkEUAt662qBLQQFfKJiLC0kD5pJJL70gIfyqBHu2h68QiFU8DXSkbLQ1UTCq59A0nX2kRrO3sQEsuajINdKVstCRQQefAGP2j1s1Qq+Ry5hEuYPXuPU4HIV0+V8XRQFfKRovrygA43GVtdtE7Ekyphw7WjdFQWHvo6jQNdKVs1FRnjXRp7bbKLr3DyddCj3E5RDe4UJNooCtlo8aaaKB3DTEaGmcsHKEyxR66x+XQGrqaRANdKRuVepzM9ZfQ2j08MakolRo6WEvoaqCreBroStmssbaM1u4hugbHgOTruMS4XaIzRdUkGuhK2WxxXTmHu4d44bC12cWq+f6Uvs7tcBDUHrqKo4GulM2a6srpGgzy650nWFhdyqKaspS+zuXUHrqaTANdKZs11VoB/sf93Vy1tA4RSenr3E6HroeuJkkp0EVknYjsFZH9InJPgue9IvJo9PnNItKU7oYqVahiQxcBrmquS/nrXE4HQe2hqzhJA11EnMB9wM3ASuBOEVk55bT3AKeMMcuArwNfSndDlSpUsaGLAFcurU3569wO0bVc1CSuFM5ZC+w3xhwEEJFHgPXArrhz1gOfiz7+CfBvIiLGGO0+KJVEbOhiVZmbugpvyl/ndjp44cgpbvza7zLYOpUJH7m+mTdeOD/t100l0BcAR+M+bwMum+kcY0xYRPqAWqAr/iQRuRu4G2DRokWzbLJShefvX7+c6vLUhivG/NUVjWf9NSo3pDob+GylEuiJ7tBM7Xmncg7GmAeABwBaWlq0965U1FsuWXjWX3PLBfO45YJ5GWiNylep3BRtAxriPl8IHJ/pHBFxAZVATzoaqJRSKjWpBPoWoFlEFouIB7gD2DDlnA3AO6OP3wo8qfVzpZTKrqQll2hN/EPAJsAJfNcYs1NEPg9sNcZsAP4DeEhE9mP1zO/IZKOVUkpNl0oNHWPMRmDjlGP3xj0eBW5Lb9OUUkqdDZ0pqpRSBUIDXSmlCoQGulJKFQgNdKWUKhBi1+hCEekEDs/yy+uYMgs1B2kb00PbmB7axvTIhTY2GmMCiZ6wLdDPhYhsNca02N2OM9E2poe2MT20jemR623UkotSShUIDXSllCoQ+RroD9jdgBRoG9ND25ge2sb0yOk25mUNXSml1HT52kNXSik1hQa6UkoViLwL9GQbVttBRBpE5CkR2S0iO0Xko9HjnxORYyKyI/pxi83tbBWRl6Nt2Ro9ViMiT4jIvui/1Ta1bXnc+7RDRPpF5GO58B6KyHdFpENEXok7lvB9E8s3ot+fL4nIGpva9xUR2RNtw3+JSFX0eJOIjMS9n/dnun1naOOM/7ci8o/R93CviLzexjY+Gte+VhHZET1uy/uYlDEmbz6wlu89ACwBPMCLwMocaNc8YE30sQ94FWtD7c8Bf2d3++La2QrUTTn2ZeCe6ON7gC/lQDudwAmgMRfeQ+AaYA3wSrL3DbgFeBxrF6/Lgc02te8mwBV9/KW49jXFn2fze5jw/zb6s/Mi4AUWR3/mnXa0ccrzXwXutfN9TPaRbz30iQ2rjTFBILZhta2MMe3GmBeijweA3Vj7rOaD9cCD0ccPAn9hY1tirgcOGGNmO5M4rYwxv2f6DlwzvW/rgR8Yy3NAlYhkdJ+4RO0zxvzGGBOOfvoc1k5jtpnhPZzJeuARY8yYMeYQsB/rZz+jztRGERHgduDhTLfjXORboCfasDqnglNEmoCLgc3RQx+K/tn7XbvKGXEM8BsR2RbdsBtgjjGmHaxfTEC9ba077Q4m/+Dk0nsYM9P7lovfo+/G+qshZrGIbBeR34nI1XY1KirR/20uvodXAyeNMfvijuXS+wjkX6CntBm1XUSkAvgp8DFjTD/wLWApcBHQjvUnm52uMsasAW4GPigi19jcnmnE2ubwVuCx6KFcew+TyanvURH5FBAGfhg91A4sMsZcDHwc+JGI+G1q3kz/tzn1HkbdyeRORi69jxPyLdBT2bDaFiLixgrzHxpjfgZgjDlpjBk3xkSAfycLfzaeiTHmePTfDuC/ou05GSsJRP/tsK+FgPXL5gVjzEnIvfcwzkzvW858j4rIO4E3AH9pooXfaBmjO/p4G1Z9+jw72neG/9uceQ9hYuP7NwOPxo7l0vsYL98CPZUNq7MuWl/7D2C3MeZrccfja6dvAl6Z+rXZIiLlIuKLPca6afYKkzf4fifwC3taOGFSTyiX3sMpZnrfNgDviI52uRzoi5VmsklE1gGfBG41xgzHHQ+IiDP6eAnQDBzMdvuirz/T/+0G4A4R8YrIYqw2Pp/t9sW5AdhjjGmLHcil93ESu+/Knu0H1iiCV7F+I37K7vZE2/RarD8JXwJ2RD9uAR4CXo4e3wDMs7GNS7BGDrwI7Iy9d0At8FtgX/TfGhvbWAZ0A5Vxx2x/D7F+wbQDIaze43tmet+wygX3Rb8/XwZabGrffqw6dOz78f7ouW+J/v+/CLwAvNHG93DG/1vgU9H3cC9ws11tjB7/PvCBKefa8j4m+9Cp/0opVSDyreSilFJqBhroSilVIDTQlVKqQGigK6VUgdBAV0qpAqGBrpRSBUIDXSmlCsT/B6MWCvbU8vcjAAAAAElFTkSuQmCC\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "needs_background": "light"
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "# Plot 1 heartbeat\n",
        "x_train.values[87553, :]\n",
        "plt.plot(np.arange(187), x_train.values[87553, :])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "BxO5Ro_Ptmu0",
        "outputId": "d49cc674-e106-4191-c750-ffdb82b63659"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<matplotlib.image.AxesImage at 0x29d84201d48>"
            ]
          },
          "execution_count": 23,
          "metadata": {},
          "output_type": "execute_result"
        },
        {
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "needs_background": "light"
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "# GAF for 1 heartbeat\n",
        "plt.imshow(x_gasf_train[87553], cmap='gray', origin='lower')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "VWGFeOTztmu0",
        "outputId": "eeb35af1-ee4f-44d1-cf0f-8e02fbabdb86"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "(187, 187)"
            ]
          },
          "execution_count": 24,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "x_gasf_train[87553].shape"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "reuqyYlgtmu0"
      },
      "outputs": [],
      "source": [
        "#plt.imshow(x_gasf_test[21891], cmap='gray', origin='lower')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "uQe_fnBotmu0"
      },
      "outputs": [],
      "source": [
        "def recurrence_plot(s, eps=None, steps=None):\n",
        "    result = []\n",
        "    if eps==None: eps=0.1\n",
        "    if steps==None: steps=10\n",
        "    d = pairwise_distances(s[:, None])\n",
        "    d = d / eps\n",
        "    d[d > steps] = steps\n",
        "    return d/5. - 1"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "DcO3r7nktmu0"
      },
      "outputs": [],
      "source": [
        "result = recurrence_plot(x_train.values[87553], steps=10)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "kE41p2hwtmu0",
        "outputId": "02d28fab-bf26-4694-d893-d8f5194c6473"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "(187, 187)"
            ]
          },
          "execution_count": 28,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "result.shape"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "2QWQ8JB_tmu0",
        "outputId": "494329a3-ddf6-4cb3-e24d-db1eb3c66be1"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<matplotlib.image.AxesImage at 0x29d840af588>"
            ]
          },
          "execution_count": 29,
          "metadata": {},
          "output_type": "execute_result"
        },
        {
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 1080x1008 with 1 Axes>"
            ]
          },
          "metadata": {
            "needs_background": "light"
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "# Recurrence plot for 1 heartbeat\n",
        "fig = plt.figure(figsize=(15,14))\n",
        "ax = fig.add_subplot(2, 3, 1)\n",
        "ax.imshow(result, cmap='gray')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "xqazlALqtmu1",
        "outputId": "758377a6-ed02-46bb-8100-021ccf318fb6"
      },
      "outputs": [
        {
          "ename": "ValueError",
          "evalue": "Found array with dim 3. check_pairwise_arrays expected <= 2.",
          "output_type": "error",
          "traceback": [
            "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
            "\u001b[1;31mValueError\u001b[0m                                Traceback (most recent call last)",
            "\u001b[1;32m<ipython-input-30-bd1eb50de03c>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      2\u001b[0m \u001b[0mfig\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m15\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m14\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[0max\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mfig\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0madd_subplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m3\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[0max\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mimshow\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrecurrence_plot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx_train\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m25\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msteps\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcmap\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'gray'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      5\u001b[0m \u001b[0md\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mrecurrence_plot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx_train\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m25\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msteps\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      6\u001b[0m \u001b[0mscaler\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mMinMaxScaler\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
            "\u001b[1;32m<ipython-input-26-e80e1fe4f0af>\u001b[0m in \u001b[0;36mrecurrence_plot\u001b[1;34m(s, eps, steps)\u001b[0m\n\u001b[0;32m      3\u001b[0m     \u001b[1;32mif\u001b[0m \u001b[0meps\u001b[0m\u001b[1;33m==\u001b[0m\u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0meps\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m0.1\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      4\u001b[0m     \u001b[1;32mif\u001b[0m \u001b[0msteps\u001b[0m\u001b[1;33m==\u001b[0m\u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0msteps\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 5\u001b[1;33m     \u001b[0md\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpairwise_distances\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ms\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      6\u001b[0m     \u001b[0md\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0md\u001b[0m \u001b[1;33m/\u001b[0m \u001b[0meps\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      7\u001b[0m     \u001b[0md\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0md\u001b[0m \u001b[1;33m>\u001b[0m \u001b[0msteps\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0msteps\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
            "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\validation.py\u001b[0m in \u001b[0;36minner_f\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m     71\u001b[0m                           FutureWarning)\n\u001b[0;32m     72\u001b[0m         \u001b[0mkwargs\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m{\u001b[0m\u001b[0mk\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0marg\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mk\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0marg\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mzip\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msig\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mparameters\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0margs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 73\u001b[1;33m         \u001b[1;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     74\u001b[0m     \u001b[1;32mreturn\u001b[0m \u001b[0minner_f\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     75\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
            "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\sklearn\\metrics\\pairwise.py\u001b[0m in \u001b[0;36mpairwise_distances\u001b[1;34m(X, Y, metric, n_jobs, force_all_finite, **kwds)\u001b[0m\n\u001b[0;32m   1773\u001b[0m         \u001b[0mfunc\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpartial\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdistance\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcdist\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmetric\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mmetric\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1774\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1775\u001b[1;33m     \u001b[1;32mreturn\u001b[0m \u001b[0m_parallel_pairwise\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mX\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mY\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mn_jobs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   1776\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1777\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
            "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\sklearn\\metrics\\pairwise.py\u001b[0m in \u001b[0;36m_parallel_pairwise\u001b[1;34m(X, Y, func, n_jobs, **kwds)\u001b[0m\n\u001b[0;32m   1357\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1358\u001b[0m     \u001b[1;32mif\u001b[0m \u001b[0meffective_n_jobs\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mn_jobs\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1359\u001b[1;33m         \u001b[1;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mX\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mY\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   1360\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1361\u001b[0m     \u001b[1;31m# enforce a threading backend to prevent data communication overhead\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
            "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\validation.py\u001b[0m in \u001b[0;36minner_f\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m     71\u001b[0m                           FutureWarning)\n\u001b[0;32m     72\u001b[0m         \u001b[0mkwargs\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m{\u001b[0m\u001b[0mk\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0marg\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mk\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0marg\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mzip\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msig\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mparameters\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0margs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 73\u001b[1;33m         \u001b[1;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     74\u001b[0m     \u001b[1;32mreturn\u001b[0m \u001b[0minner_f\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     75\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
            "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\sklearn\\metrics\\pairwise.py\u001b[0m in \u001b[0;36meuclidean_distances\u001b[1;34m(X, Y, Y_norm_squared, squared, X_norm_squared)\u001b[0m\n\u001b[0;32m    266\u001b[0m     \u001b[0mpaired_distances\u001b[0m \u001b[1;33m:\u001b[0m \u001b[0mdistances\u001b[0m \u001b[0mbetweens\u001b[0m \u001b[0mpairs\u001b[0m \u001b[0mof\u001b[0m \u001b[0melements\u001b[0m \u001b[0mof\u001b[0m \u001b[0mX\u001b[0m \u001b[1;32mand\u001b[0m \u001b[0mY\u001b[0m\u001b[1;33m.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    267\u001b[0m     \"\"\"\n\u001b[1;32m--> 268\u001b[1;33m     \u001b[0mX\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mY\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcheck_pairwise_arrays\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mX\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mY\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    269\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    270\u001b[0m     \u001b[1;31m# If norms are passed as float32, they are unused. If arrays are passed as\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
            "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\validation.py\u001b[0m in \u001b[0;36minner_f\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m     71\u001b[0m                           FutureWarning)\n\u001b[0;32m     72\u001b[0m         \u001b[0mkwargs\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m{\u001b[0m\u001b[0mk\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0marg\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mk\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0marg\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mzip\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msig\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mparameters\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0margs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 73\u001b[1;33m         \u001b[1;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     74\u001b[0m     \u001b[1;32mreturn\u001b[0m \u001b[0minner_f\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     75\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
            "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\sklearn\\metrics\\pairwise.py\u001b[0m in \u001b[0;36mcheck_pairwise_arrays\u001b[1;34m(X, Y, precomputed, dtype, accept_sparse, force_all_finite, copy)\u001b[0m\n\u001b[0;32m    140\u001b[0m         X = Y = check_array(X, accept_sparse=accept_sparse, dtype=dtype,\n\u001b[0;32m    141\u001b[0m                             \u001b[0mcopy\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mcopy\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mforce_all_finite\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mforce_all_finite\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 142\u001b[1;33m                             estimator=estimator)\n\u001b[0m\u001b[0;32m    143\u001b[0m     \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    144\u001b[0m         X = check_array(X, accept_sparse=accept_sparse, dtype=dtype,\n",
            "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\validation.py\u001b[0m in \u001b[0;36minner_f\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m     71\u001b[0m                           FutureWarning)\n\u001b[0;32m     72\u001b[0m         \u001b[0mkwargs\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m{\u001b[0m\u001b[0mk\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0marg\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mk\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0marg\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mzip\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msig\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mparameters\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0margs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 73\u001b[1;33m         \u001b[1;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     74\u001b[0m     \u001b[1;32mreturn\u001b[0m \u001b[0minner_f\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     75\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
            "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\validation.py\u001b[0m in \u001b[0;36mcheck_array\u001b[1;34m(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator)\u001b[0m\n\u001b[0;32m    640\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mallow_nd\u001b[0m \u001b[1;32mand\u001b[0m \u001b[0marray\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mndim\u001b[0m \u001b[1;33m>=\u001b[0m \u001b[1;36m3\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    641\u001b[0m             raise ValueError(\"Found array with dim %d. %s expected <= 2.\"\n\u001b[1;32m--> 642\u001b[1;33m                              % (array.ndim, estimator_name))\n\u001b[0m\u001b[0;32m    643\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    644\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[0mforce_all_finite\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
            "\u001b[1;31mValueError\u001b[0m: Found array with dim 3. check_pairwise_arrays expected <= 2."
          ]
        },
        {
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 1080x1008 with 1 Axes>"
            ]
          },
          "metadata": {
            "needs_background": "light"
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "# Test\n",
        "fig = plt.figure(figsize=(15,14))\n",
        "ax = fig.add_subplot(2, 3, 1)\n",
        "ax.imshow(recurrence_plot(x_train.values[25][:, None], steps=10), cmap='gray')\n",
        "d = recurrence_plot(x_train.values[25][:, None], steps=10)\n",
        "scaler = MinMaxScaler((-1, 1))\n",
        "x = scaler.fit_transform(d.reshape(187 * 187, 1))\n",
        "x"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "PxVriPG5tmu1"
      },
      "outputs": [],
      "source": [
        "y_train = df_hb_train[187].values.astype(int)\n",
        "y_test = df_hb_test[187].values.astype(int)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "3yAlxbDJtmu1"
      },
      "outputs": [],
      "source": [
        "# upsampling to reduce class imbalance\n",
        "smt2 = SMOTE(sampling_strategy={1: 30000, 2: 20000, 3: 20000, 4: 10000}, n_jobs=-1, random_state=42)\n",
        "x_train_2, y_train_2 = smt2.fit_sample(x_train, y_train)\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "9-2Q88bjtmu1",
        "outputId": "3828ab22-b08f-4372-f2f8-af0de5f7ee3b"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "(87554, 187)"
            ]
          },
          "execution_count": 34,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "x_train.shape"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "yHeAEWSptmu1",
        "outputId": "f9ffecc6-7cbe-457c-82f9-9a62f7374a4b"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "(152471, 187)"
            ]
          },
          "execution_count": 35,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "x_train_2.shape"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "Yjejqr9Ttmu1"
      },
      "outputs": [],
      "source": [
        "gasf = GramianAngularField(image_size=150, method='summation')\n",
        "x_gasf_train_2 = gasf.fit_transform(x_train_2)\n",
        "x_gasf_test_2 = gasf.transform(x_test)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "hV-JOESttmu1"
      },
      "outputs": [],
      "source": [
        "# create placeholders, then populate with images\n",
        "with h5py.File('hb_data_mit_bih_balanced_2.hdf5', mode='w') as hdf5_file:\n",
        "    hdf5_file.create_dataset(\"x_train\", (len(x_gasf_train_2), 224, 224), np.float32)  # 224, 224 for resnet\n",
        "    hdf5_file.create_dataset(\"y_train\", (len(y_train_2),), np.int32)\n",
        "    hdf5_file.create_dataset(\"x_test\", (len(x_gasf_test_2), 224, 224), np.float32)\n",
        "    hdf5_file.create_dataset(\"y_test\", (len(y_test),), np.int32)\n",
        "\n",
        "    transform = transforms.Compose([transforms.Resize((224, 224))])\n",
        "\n",
        "    for i, (x, y) in enumerate(zip(x_gasf_train_2, y_train_2)):\n",
        "        image = Image.fromarray(x.astype(float))\n",
        "        t = np.array(transform(image))\n",
        "        hdf5_file[\"x_train\"][i, ...] = t\n",
        "        hdf5_file[\"y_train\"][i] = y\n",
        "\n",
        "    for i, (x, y) in enumerate(zip(x_gasf_test_2, y_test)):\n",
        "        image = Image.fromarray(x.astype(float))\n",
        "        t = np.array(transform(image))\n",
        "        hdf5_file[\"x_test\"][i, ...] = t\n",
        "        hdf5_file[\"y_test\"][i] = y"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "DC3YenGftmu1"
      },
      "outputs": [],
      "source": [
        "# upsampling to try with GramianAngularField method='difference'\n",
        "# results are almost same for both\n",
        "smt3 = SMOTE(sampling_strategy={1: 30000, 2: 20000, 3: 20000, 4: 10000}, n_jobs=-1, random_state=42)\n",
        "x_train_3, y_train_3 = smt3.fit_sample(x_train, y_train)\n",
        "\n",
        "gasf = GramianAngularField(image_size=150, method='difference')\n",
        "x_gasf_train_3 = gasf.fit_transform(x_train_3)\n",
        "x_gasf_test_3 = gasf.transform(x_test)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "bTPnA_2Atmu1"
      },
      "outputs": [],
      "source": [
        "with h5py.File('hb_data_mit_bih_balanced_3.hdf5', mode='w') as hdf5_file:\n",
        "    hdf5_file.create_dataset(\"x_train\", (len(x_gasf_train_3), 224, 224), np.float32)\n",
        "    hdf5_file.create_dataset(\"y_train\", (len(y_train_3),), np.int32)\n",
        "    hdf5_file.create_dataset(\"x_test\", (len(x_gasf_test_3), 224, 224), np.float32)\n",
        "    hdf5_file.create_dataset(\"y_test\", (len(y_test),), np.int32)\n",
        "\n",
        "    transform = transforms.Compose([transforms.Resize((224, 224))])\n",
        "\n",
        "    for i, (x, y) in enumerate(zip(x_gasf_train_3, y_train_3)):\n",
        "        image = Image.fromarray(x.astype(float))\n",
        "        t = np.array(transform(image))\n",
        "        hdf5_file[\"x_train\"][i, ...] = t\n",
        "        hdf5_file[\"y_train\"][i] = y\n",
        "\n",
        "    for i, (x, y) in enumerate(zip(x_gasf_test_3, y_test)):\n",
        "        image = Image.fromarray(x.astype(float))\n",
        "        t = np.array(transform(image))\n",
        "        hdf5_file[\"x_test\"][i, ...] = t\n",
        "        hdf5_file[\"y_test\"][i] = y"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "s3ervPDYtmu5"
      },
      "outputs": [],
      "source": [
        "with h5py.File('hb_data_mit_bih_balanced_rp.hdf5', mode='w') as hdf5_file:\n",
        "    hdf5_file.create_dataset(\"x_train\", (len(x_train_2), 224, 224), np.float32)\n",
        "    hdf5_file.create_dataset(\"y_train\", (len(y_train_2),), np.int32)\n",
        "    hdf5_file.create_dataset(\"x_test\", (len(x_test), 224, 224), np.float32)\n",
        "    hdf5_file.create_dataset(\"y_test\", (len(y_test),), np.int32)\n",
        "\n",
        "    transform = transforms.Compose([transforms.Resize((224, 224))])\n",
        "\n",
        "    for i, (x, y) in enumerate(zip(x_train_2.values, y_train_2)):\n",
        "        r = recurrence_plot(x, steps=10)\n",
        "        image = Image.fromarray(r.astype(float))\n",
        "        t = np.array(transform(image))\n",
        "        hdf5_file[\"x_train\"][i, ...] = t\n",
        "        hdf5_file[\"y_train\"][i] = y\n",
        "\n",
        "    for i, (x, y) in enumerate(zip(x_test.values, y_test)):\n",
        "        r = recurrence_plot(x, steps=10)\n",
        "        image = Image.fromarray(r.astype(float))\n",
        "        t = np.array(transform(image))\n",
        "        hdf5_file[\"x_test\"][i, ...] = t\n",
        "        hdf5_file[\"y_test\"][i] = y"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "en6cPu_Qtmu5"
      },
      "outputs": [],
      "source": [
        "# Generating mixed hdf5: containing RP, GAF and mean of RP and GAF in 3 channels\n",
        "# Previous ones were single channel images\n",
        "with h5py.File('/media/asif/data/hb_data_mit_bih_balanced_mixed.hdf5', mode='w') as hdf5_file:\n",
        "    hdf5_file.create_dataset(\"x_train\", (len(x_train_3), 3, 224, 224), np.float32)\n",
        "    hdf5_file.create_dataset(\"y_train\", (len(y_train_3),), np.int32)\n",
        "    hdf5_file.create_dataset(\"x_test\", (len(x_test), 3, 224, 224), np.float32)\n",
        "    hdf5_file.create_dataset(\"y_test\", (len(y_test),), np.int32)\n",
        "\n",
        "    transform = transforms.Compose([transforms.Resize((224, 224))])\n",
        "\n",
        "    for i, (x1, x2, y) in enumerate(zip(x_gasf_train_3, x_train_3.values, y_train_3)):\n",
        "        image = Image.fromarray(x1.astype(float))\n",
        "        t = np.array(transform(image))\n",
        "        r = recurrence_plot(x2, steps=10)\n",
        "        image = Image.fromarray(r.astype(float))\n",
        "        t2 = np.array(transform(image))\n",
        "        hdf5_file[\"x_train\"][i, 0, ...] = t\n",
        "        hdf5_file[\"x_train\"][i, 1, ...] = t2\n",
        "        hdf5_file[\"x_train\"][i, 2, ...] = (t + t2) / 2\n",
        "        hdf5_file[\"y_train\"][i] = y\n",
        "\n",
        "    for i, (x1, x2, y) in enumerate(zip(x_gasf_test_3, x_test.values, y_test)):\n",
        "        image = Image.fromarray(x1.astype(float))\n",
        "        t = np.array(transform(image))\n",
        "        r = recurrence_plot(x2, steps=10)\n",
        "        image = Image.fromarray(r.astype(float))\n",
        "        t2 = np.array(transform(image))\n",
        "        hdf5_file[\"x_test\"][i, 0, ...] = t\n",
        "        hdf5_file[\"x_test\"][i, 1, ...] = t2\n",
        "        hdf5_file[\"x_test\"][i, 2, ...] = (t + t2) / 2\n",
        "        hdf5_file[\"y_test\"][i] = y"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "wQB4wox-tmu5"
      },
      "outputs": [],
      "source": [
        "# Hearbeat values range from 0 to 1; we will divide into quantiles and see which bin each value belongs to\n",
        "# and what the probability is to transfer from 1 bin to other\n",
        "# i.e if 1 value is in bin 1 and the next value is in bin 5, what is the probability of transferring from\n",
        "# bin 1 to 5\n",
        "# correlation matrix of probabilities is markov transition field\n",
        "def get_quantiles(min_value=0, max_val=1, k=10):\n",
        "    c = (max_val - min_value)/k\n",
        "    b = min_value + c\n",
        "    d = []\n",
        "    for i in range(1, k):\n",
        "        d.append(b)\n",
        "        b += c\n",
        "    d.append(max_val)\n",
        "    return d\n",
        "\n",
        "quantiles = get_quantiles()\n",
        "\n",
        "def value_to_quantile(x):\n",
        "    for i, k in enumerate(quantiles):\n",
        "        if x <= k:\n",
        "            return i\n",
        "    return 0\n",
        "\n",
        "# qv_train = np.vectorize(value_to_quantile)(x_train_3.values)\n",
        "# qv_test = np.vectorize(value_to_quantile)(x_test.values)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "Y7cLvbSntmu5"
      },
      "outputs": [],
      "source": [
        "def get_mtf(x, size=10):\n",
        "    q = np.vectorize(value_to_quantile)(x)\n",
        "    r = np.zeros((q.shape[0], q.shape[0]))\n",
        "    y = np.zeros((size, size))\n",
        "    for i in range(x.shape[0] - 1):\n",
        "        y[q[i], q[i + 1]] += 1\n",
        "    y = y / y.sum(axis=1, keepdims=True)\n",
        "    y[np.isnan(y)] = 0\n",
        "\n",
        "    for i in range(r.shape[0]):\n",
        "        for j in range(r.shape[1]):\n",
        "            r[i, j] = y[q[i], q[j]]\n",
        "    return r / 5. - 1"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "MCnVdQO_tmu5",
        "outputId": "5b8e8c2b-0930-4a9c-fd78-99384f3ab20d"
      },
      "outputs": [
        {
          "ename": "NameError",
          "evalue": "name 'x_train_3' is not defined",
          "output_type": "error",
          "traceback": [
            "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
            "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
            "\u001b[1;32m<ipython-input-34-9f0902006b4f>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[1;31m# MTF for 1 image\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mget_mtf\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx_train_3\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
            "\u001b[1;31mNameError\u001b[0m: name 'x_train_3' is not defined"
          ]
        }
      ],
      "source": [
        "# MTF for 1 image\n",
        "get_mtf(x_train_3.values[0])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "_gZvNBtftmu5"
      },
      "outputs": [],
      "source": [
        "plt.imshow(get_mtf(x_train_3.values[0]), cmap='gray', origin='lower')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "7WtZ0Q8ttmu5"
      },
      "outputs": [],
      "source": [
        "np.seterr(divide='ignore', invalid='ignore')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "uIQ1f35btmu5"
      },
      "outputs": [],
      "source": [
        "smt3 = SMOTE(sampling_strategy={1: 30000, 2: 20000, 3: 20000, 4: 10000}, n_jobs=-1, random_state=42)\n",
        "x_train_3, y_train_3 = smt3.fit_sample(x_train, y_train)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "EYJlA32Vtmu5"
      },
      "outputs": [],
      "source": [
        "with h5py.File('/media/asif/data/hb_data_mit_bih_balanced_mtf.hdf5', mode='w') as hdf5_file:\n",
        "    hdf5_file.create_dataset(\"x_train\", (len(x_train_3), 224, 224), np.float32)\n",
        "    hdf5_file.create_dataset(\"y_train\", (len(y_train_3),), np.int32)\n",
        "    hdf5_file.create_dataset(\"x_test\", (len(x_test), 224, 224), np.float32)\n",
        "    hdf5_file.create_dataset(\"y_test\", (len(y_test),), np.int32)\n",
        "\n",
        "    transform = transforms.Compose([transforms.Resize((224, 224))])\n",
        "\n",
        "    for i, (x, y) in enumerate(zip(x_train_3.values, y_train_3)):\n",
        "        mtf = get_mtf(x)\n",
        "        image = Image.fromarray(mtf.astype(float))\n",
        "        t = np.array(transform(image))\n",
        "        hdf5_file[\"x_train\"][i, ...] = t\n",
        "        hdf5_file[\"y_train\"][i] = y\n",
        "\n",
        "    for i, (x, y) in enumerate(zip(x_test.values, y_test)):\n",
        "        mtf = get_mtf(x)\n",
        "        image = Image.fromarray(mtf.astype(float))\n",
        "        t = np.array(transform(image))\n",
        "        hdf5_file[\"x_test\"][i, ...] = t\n",
        "        hdf5_file[\"y_test\"][i] = y"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "RcCmd0Pstmu5"
      },
      "outputs": [],
      "source": [
        "# 3 channels, this time with GAF, RP and MTF\n",
        "with h5py.File('/media/asif/data/hb_data_mit_bih_balanced_gaf_rp_mtf.hdf5', mode='w') as hdf5_file:\n",
        "    hdf5_file.create_dataset(\"x_train\", (len(x_train_3), 3, 224, 224), np.float32)\n",
        "    hdf5_file.create_dataset(\"y_train\", (len(y_train_3),), np.int32)\n",
        "    hdf5_file.create_dataset(\"x_test\", (len(x_test), 3, 224, 224), np.float32)\n",
        "    hdf5_file.create_dataset(\"y_test\", (len(y_test),), np.int32)\n",
        "\n",
        "    transform = transforms.Compose([transforms.Resize((224, 224))])\n",
        "\n",
        "    for i, (x1, x2, y) in enumerate(zip(x_gasf_train_3, x_train_3.values, y_train_3)):\n",
        "        image = Image.fromarray(x1.astype(float))\n",
        "        t = np.array(transform(image))\n",
        "        r = recurrence_plot(x2, steps=10)\n",
        "        mtf = get_mtf(x2)\n",
        "        image = Image.fromarray(r.astype(float))\n",
        "        t2 = np.array(transform(image))\n",
        "        image = Image.fromarray(mtf.astype(float))\n",
        "        t3 = np.array(transform(image))\n",
        "        hdf5_file[\"x_train\"][i, 0, ...] = t\n",
        "        hdf5_file[\"x_train\"][i, 1, ...] = t2\n",
        "        hdf5_file[\"x_train\"][i, 2, ...] = t3\n",
        "        hdf5_file[\"y_train\"][i] = y\n",
        "\n",
        "    for i, (x1, x2, y) in enumerate(zip(x_gasf_test_3, x_test.values, y_test)):\n",
        "        image = Image.fromarray(x1.astype(float))\n",
        "        t = np.array(transform(image))\n",
        "        r = recurrence_plot(x2, steps=10)\n",
        "        mtf = get_mtf(x2)\n",
        "        image = Image.fromarray(r.astype(float))\n",
        "        t2 = np.array(transform(image))\n",
        "        image = Image.fromarray(mtf.astype(float))\n",
        "        t3 = np.array(transform(image))\n",
        "        hdf5_file[\"x_test\"][i, 0, ...] = t\n",
        "        hdf5_file[\"x_test\"][i, 1, ...] = t2\n",
        "        hdf5_file[\"x_test\"][i, 2, ...] = t3\n",
        "        hdf5_file[\"y_test\"][i] = y"
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.7.4"
    },
    "colab": {
      "provenance": [],
      "gpuType": "T4",
      "include_colab_link": true
    },
    "accelerator": "GPU"
  },
  "nbformat": 4,
  "nbformat_minor": 0
}